8结构体与方法

  • 前面已经多次使用过自定义类型,这种自定义类型正是通过Go语言类型别名和结构体的形式支撑的。
  • 结构体也是复合类型

  • 结构体依旧是值类型,因此可以通过new函数来创建。

8.1结构体

  • Go中没有类的概念,因此Go中结构体有着更特别重要的地位。

8.1.1结构体定义

8结构体与方法

  • type T struct{a,b int}也合法,适用于那些简单的结构体。
  • 如果字段从来不会被用到,可命名为_(空标识符)

  • 字段可是任意的类型,
    • 结构体本身,函数或者接口。
  • 声明结构体类型的一个变量,并给它的字段赋值

8结构体与方法

  • 数组可以看作一种结构体类型,不过它使用下标而不是具名字段。

1.用new创建结构体

  • 结构体定义后,习惯t=new(T)给该结构体变量分配内存,
    • 它返回指向已分配内存的指针
  • t是指向T的指针,结构体字段的值是它们所属类型的零值
  • 定义和分配内存两部分代码一定要放在一起
    • 结构体定义范围是整个包,但内存可选择在合适时候分配

var t *T
t= new(T)

  • 声明 var t T,

  • 也会给t分配内存,并初始化为零值

  • 这时t是类型T的

  • t被称作类型T的一个实例或对象

8结构体与方法

  • 像面向对象那样,用点符号给字段赋值

8结构体与方法

  • 点符号也可以用于获取结构体字段的值

8结构体与方法

  • 点符号在Go中叫作选择器,
  • 无论变量是一个结构体类型还是一个结构体类型指针,都可以使用相同的选择器符号

8结构体与方法

  • 初始化一个结构体也可通过一个结构体字面量( struct- literal)来实现(这样更简短)

8结构体与方法

  • 上面第一种写法称混合字面量语法:&T{…}这种写法依旧会调用new初始化,大括号里面的值必须按照顺序

  • 值的前面放上字段名来初始化字段,
  • new(Type)和&Type{}等价

8结构体与方法

  • 第一种必须顺序,&可省略,毕竟不是直接通过字面量初始化的,前面已经定义了
  • 第二种顺序不必一致,且某些字段还可以被忽略掉,就像第三行