106【GoLand-基础2】(三)

简介: 106【GoLand-基础2】
  1. 结构体的定义

go语言没有面向对象的概念,结构体的定义与类型定义类似,只不过多了一个struct关键字。

1. 结构体的定义
type 结构体类型名称 struct{
  成员定义;
  成员定义;
  成员定义;
}
-----------------测试
package main
import "fmt"
type Student struct {
  name    string
  age     int
  sex     int
  teacher string
}
func main() {
  var s1 Student 
  s1.name = "李明"
  s1.age = 20
  s1.sex = 0
  s1.teacher = "王先生"
  fmt.Printf("%T\n", s1)
  fmt.Printf("%v\n", s1)
}
-----------------测试
2.匿名结构体定义:
var 结构体名字 struct{
  xxxx
  xxxx
}
-----------------测试
package main
import "fmt"
func main() {
  var Student struct {
    name    string
    age     int
    sex     int
    teacher string
  }
  Student.age = 20
  Student.name = "jsxs"
  Student.sex = 1
  Student.teacher = "丽丽"
  fmt.Printf("%v\n", Student)
}
-----------------测试
  1. 结构体的初始化
1.第一种: 以键值对的方式进行初始化
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  var jsxs Person //类型定义
  //  1.第一种定义方式 -> 使用键值对
  jsxs = Person{ //进行初始化
    id:    1,
    name:  "heh",
    age:   0,
    email: "22123121", //最后一个也要添加逗号
  }
2.第二种:按照顺序的方式进行初始化。顺序一定要保持一致
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  var jsxs Person 
  jsxs = Person{1, "dsds", 0, "dssdsd"}
3.第三种:利用语法糖方式
jsxs:=Person{
  xx:xx
}
  1. 结构体指针

结构体指针和普通的变量指针相同.

1.普通方法创建结构体指针
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 *Person // 定义一个结构体指针
  p1 = &jsxs     //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1)
2. new创建结构体指针  new(结构体名字)
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 = new(Person)  ///---》利用new
  //var p1 *Person // 定义一个结构体指针
  p1 = &jsxs //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1) 
3.结构体指针的访问-》  指针变量名.属性/ (*指针变量名).属性
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 = new(Person)
  //var p1 *Person // 定义一个结构体指针
  p1 = &jsxs //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1)
  fmt.Printf("%v", p1.id)  //与下面的结果一致
  fmt.Printf("%v", (*p1).id) //与上面的结果一致 (*)可以省略 

4.结构体作为函数参数

go结构体可以像普通变量一样,作为函数的参数,这里分为两种情况

  1. 直接传递结构体,这是一个副本(拷贝),在函数内部不会改变外面结构体内容
  2. 传递结构体指针,这时在函数内部,能够改变外部结构体内容
1. 值传递: 形参改变实参不变
package main
import "fmt"
type Person struct {
  id    int
  name  string
  age   int
  email string
}
func test(p1 Person) {
  p1.id = 1
  p1.name = "sdsds"
  p1.age = 20
  p1.email = "sdsd"
  fmt.Printf("%v\t", p1)
}
func main() {
  person := Person{2, "SDDF", 0, "GFDG"}
  test(person) //值传递
  fmt.Printf("%v\t", person)
}
--------------
2.指针传递: 形参改变实参也改变
package main
import "fmt"
type Person struct {
  id    int
  name  string
  age   int
  email string
}
func test(p1 *Person) { //指针接受
  p1.id = 1
  p1.name = "sdsds"
  p1.age = 20
  p1.email = "sdsd"
  fmt.Printf("%v\t", p1)
}
func main() {
  person := Person{2, "SDDF", 0, "GFDG"}
  p1 := new(Person) // 创建一个指针
  p1 = &person
  test(p1) //传递一个地址
  fmt.Printf("%v\t", *p1)
}
  1. 结构体的嵌套
package main
import "fmt"
type Person struct {
  name string
  age  int
  pie  Pie  //人类拥有宠物
}
type Pie struct {
  name string  //姓名
  sort string  //种类
}
func main() {
  p := Person{
    name: "jsxs",
    age:  20,
    pie: Pie{ //初始化结构体
      name: "小黄",
      sort: "金毛",
    },
  }
  fmt.Printf("%v", p)
}
(10).方法 ✔™✅

Go语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法概念。我们也可以声明一些方法,属于某一个结构体。

Go语言方法的语法

Go中的方法是一种特殊的函数,定义struct之上(与struct关联,绑定),被称为struct的接收者(receive)通俗的讲: "方法就是有接收者的函数"

  1. 方法的定义
1.方法的定义 -> 一个方法和一个函数非常相似,多了一个接受类型
type 结构体名 struct{}
func (接受该方法的结构体 结构体名) 方法名称(参数列表) 返回值类型 {}
func (接受该方法的结构体 *结构体名) 方法名称(参数列表) 返回值类型 {}
***********************************************************
值传递 
package main
import "fmt"
type Person struct { // 1.定义一个结构体
  name string
}
func (per Person) eat() { //2. 给结构体Person添加一个eat()的方法
  fmt.Printf("%v,eat....", per.name)
}
func (per Person) sleep() { //3. 给结构体Person添加一个sleep()的方法
  fmt.Printf("%v,sleep....", per.name)
}
func (per Person) sum(a, b int) int {
  return a + b
}
func main() {
  person := Person{ // 4.初始化结构体
    name: "李明",
  }
  person.eat() // 5.结构体本身调用自己的属性
  person.sleep()
  println(person.sum(1, 2))
}
***********************************************************
  1. 方法接收者类型

结构体实列,有值类型指针类型,那么方法的接受者是结构体,那么有值类型和指针类型。区别就是接收者是否赋值结构体副本。值类型拷贝,指针类型不拷贝

指针传递
package main
import "fmt"
type Person struct { // 1.定义一个结构体
  name string
}
func (per *Person) test() {  //2.添加一个指针
  per.name = "sssss"
  fmt.Printf("%v", per.name)
}
func main() {
  person := Person{ // 4.初始化结构体
    name: "李明",
  }
  p := new(Person)
  p = &person
  fmt.Printf("%v", person)
  p.test()  // 通过指针进行调用
  fmt.Printf("%v", person)
  //println(person)
}
(11).接口类型

接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。Go语言的接口是一种新的类型定义,他把所有的具有共性的方法定义在一起任何具有其他类型只要实现了这些方法就是实现了这个接口

1.接口的初始化

1.定义接口
type interface_name interface{
  方法名 [返回值]
}
2. 定义结构体
 type struct_name struct{
  成员变量
}
3.实现接口的方法
func(结构体变量 结构体变量名) 方法名() [返回值类型]{
方法实现
}
4.声明接口有哪个结构体来实现

在接口中定义,若干个空方法。这些方法都具有通用性。

假如说一个结构体要实现一个接口,那么他要实现结构体的所有方法;否则会报错

package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法-》实现接口的方法
func (c Computer) read() {
  fmt.Printf("%v\n,read......", c.name)
}
// 给结构体添加一个方法-》实现接口的方法
func (c Computer) write() {
  fmt.Printf("%v\n,write......", c.name)
}
func main() {
  var usb USB  // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = computer  //声明这个接口将有computer这个结构体来实现
  usb.read() //接口调用
  usb.write()
}
  1. 接口值类型接收者和指针类型接收者

值接受就是一个拷贝,指针接受就是非拷贝

1.值传递
******************************************************
package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法
func (c Computer) read() {
  c.name = "sds"   // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,reading......\n", c.name)
}
// 给结构体添加一个方法
func (c Computer) write() {
  c.name = "sds"   // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,write......\n", c.name)
}
func main() {
  var usb USB // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = computer //声明这个接口将有computer这个结构体来实现
  usb.read()     //接口调用
  usb.write()
  fmt.Printf("%v", computer.name)
}
******************************************************
2.指针传递
******************************************************
package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法
func (c *Computer) read() {  // 指针传递 -----
  c.name = "sds" // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,reading......\n", c.name)
}
// 给结构体添加一个方法
func (c *Computer) write() {  // 指针传递 -----
  c.name = "sds" // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,write......\n", c.name)
}
func main() {
  var usb USB // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = &computer //声明这个接口将有computer这个结构体来实现  ---指针传递
  usb.read()      //接口调用
  usb.write()
  fmt.Printf("%v", computer.name)
}
相关文章
|
1天前
|
Go
GoLand创建项目过程
GoLand创建项目过程
16 0
|
6月前
|
Cloud Native 测试技术 Go
你不知道的goland技巧
你不知道的goland技巧
|
8月前
|
关系型数据库 Go
106【GoLand-基础2】(四)
106【GoLand-基础2】
55 0
|
6月前
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
221 0
|
6月前
|
C++
03 C++ - CLion创建程序
03 C++ - CLion创建程序
59 0
|
8月前
|
测试技术 编译器 Go
106【GoLand-基础2】(一)
106【GoLand-基础2】
40 0
|
8月前
|
Go 索引 容器
106【GoLand-基础2】(二)
106【GoLand-基础2】
24 0
|
11月前
|
缓存 Java 程序员
2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程
GO语言也称为Golang,由谷歌出品,随着云计算的发展而不断壮大,近年来,使用GO语言的程序员越来越多,GO程序员一般被称为GOpher。由于博主硬盘空间较为充足,不考虑移动软件安装目录,需要者请自行寻找方法,本文为无脑操作。
318 0
2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程
|
移动开发 前端开发 小程序
为了偷懒,我用google/zx一键自动打包编译了前后端项目并发布到指定环境
由于正在负责的一个项目,就说前端涉及到PC端、公众号端、APP端的H5、小程序端、可视化大屏端,而PC和APP又通过qiankun引入了微前端的理念。整体一圈下来可能光前端编译打包就要build差不多二十次。而有时候经常性的bug改动,这个时候便只需要进行测试后需要进行小范围的测试。
179 0
|
API iOS开发 开发者
Xcode自动打包和上传蒲公英平台脚本(用python实现)
工作中,特别是所做项目进入测试阶段,肯定会经常打 Ad-hoc 包给测试人员进行测试,但是我们肯定不想每次进行打包的时候都要进行一些工程的设置修改,以及一系列的 next 按钮点击操作,现在就让这些操作都交给脚本化吧!
317 0