8结构体与方法
文章目录
- 前面已经多次使用过自定义类型,这种自定义类型正是通过Go语言类型别名和结构体的形式支撑的。
- 结构体也是复合类型
- 结构体依旧是值类型,因此可以通过new函数来创建。
8.1结构体
- Go中没有类的概念,因此Go中结构体有着更特别重要的地位。
8.1.1结构体定义
- type T struct{a,b int}也合法,适用于那些简单的结构体。
- 如果字段从来不会被用到,可命名为_(空标识符)
- 字段可是任意的类型,
- 结构体本身,函数或者接口。
- 声明结构体类型的一个变量,并给它的字段赋值
- 数组可以看作一种结构体类型,不过它使用下标而不是具名字段。
1.用new创建结构体
- 结构体定义后,习惯t=new(T)给该结构体变量分配内存,
- 它返回指向已分配内存的指针
- t是指向T的指针,结构体字段的值是它们所属类型的零值
- 定义和分配内存两部分代码一定要放在一起
- 结构体定义范围是整个包,但内存可选择在合适时候分配
var t *T
t= new(T)
-
声明 var t T,
-
也会给t分配内存,并初始化为零值
-
这时t是类型T的
-
t被称作类型T的一个实例或对象
- 像面向对象那样,用点符号给字段赋值
- 点符号也可以用于获取结构体字段的值
- 点符号在Go中叫作选择器,
- 无论变量是一个结构体类型还是一个结构体类型指针,都可以使用相同的选择器符号
- 初始化一个结构体也可通过一个结构体字面量( struct- literal)来实现(这样更简短)
- 上面第一种写法称混合字面量语法:&T{…}这种写法依旧会调用new初始化,大括号里面的值必须按照顺序
- 值的前面放上字段名来初始化字段,
- new(Type)和&Type{}等价
- 第一种必须顺序,&可省略,毕竟不是直接通过字面量初始化的,前面已经定义了
- 第二种顺序不必一致,且某些字段还可以被忽略掉,就像第三行