GO学习笔记系列

go学习笔记之--结构体(struct)

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。

结构体内存布局

如同c一样,结构体占用一块连续的内存。

结构体定义

Go语言中通过struct来实现面向对象。
定义:使用type和struct关键字来定义结构体,如下:

type 类型名 struct {
    字段名 字段类型
    字段名 字段类型
    …
}

结构体实例化

只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。var或者取结构体的地址实例化:

 var 结构体实例 结构体类型
// new函数使用场景不多,使用&对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作。
p := &person{}
p.name ="小帅" //底层中是(*p).name="小帅" 能简写是因为GO实现的语法糖

匿名结构体出现在定义一些临时数据结构的场景下,还没怎么用到,先不记载

方法和接收者

Go语言中的方法(Method)是一种作用于特定类型变量的函数 .
方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
现在的理解是,类似于在php的类中定义方法.就是多了一个接受者,目的是为了说明是那个结构体的方法.更为灵活的是:不止于结构体,你可以为任何类型定义你想定义的方法.

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
    函数体
}

说明:

  1. 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。
  2. 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
  3. 方法名、参数列表、返回参数:具体格式与函数定义相同。

注意:

  1. 方法与函数的区别是,函数不属于任何类型,方法属于特定的类型
  2. 接收者类型为指针类型时,调用方法时修改接受者指针的任意成员变量,在方法结束后,修改都是有效的.
  3. 当方法作用于值类型接受者时,Go会将接受者的值复制一份,值类型接受者的方法中修改的操作知识针对副本,无法修改接受者本身.
  4. 什么时候应该使用指针类型接收者:

需要修改接收者中的值
接收者是拷贝代价比较大的大对象
保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者

  1. 任意类型都可以添加方法

嵌套结构体

说明:一个结构体中可以嵌套包含另外一个结构体或结构体指针,也可以嵌套的是匿名结构体.

说明:

  1. 当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。如果存在相同的字段名.为了避免歧义,需要指定具体的内嵌结构的字段
  2. 结构体中字段大写字母表示可公开访问,小写标识私有.

结构体的继承与构造

//通过嵌套匿名结构体实现继承
//构造函数可以利用函数初始化

你可能感兴趣的:(GO学习笔记系列)