3.4.1 结构定义
先来使用struct关键字定义一个struct:
type Person struct { name string gender int age int }
上述代码简单地定义了一个struct,它包含三个成员,也可以说三个字段或属性。在语法上,可以把同类型的元素写在一行,彼此用逗号隔开,后面跟上类型gender int、age int。但是,不建议采用放在同一行中用逗号隔开的写法,还是一行一个成员比较好。除了类型以外,在定义结构体的时候还可以定义对应的数据库字段和JSON关键字。
工程师可以定义没有任何成员的空结构体struct{},在并发编程中,channel之间的通信可以用空结构体作为信号量。
在介绍了struct的定义后,接着介绍struct的使用。我们可以定义一个所有成员都取默认初始值的struct变量,示例如下:
var p1 Person
当然也可以在定义变量的同时赋予初始值:
p2 := Person{"Scott",1,30}
这种赋值方式要求赋值顺序一定要和struct成员的定义顺序保持一致,显然,这对于写代码是非常不方便的,如果某个struct比较复杂,这种写法更是让人苦恼。所以,Go语言提供了下面的方式:
p3 := Person{name:"Scott",gender:1,age:30}
这种方式可以解决struct比较复杂时的赋值问题,也是比较常用的方式。注意,在这种方式里,Person和p3赋值语句是在一个包内完成的,如果要在其他包使用Person创建变量并赋值则会报错,因为成员首字母全部为小写。
注意
struct成员的可见性也是通过首字母大小写控制的,首字母小写仅本包可见,首字母大写则包外也可访问。
如果我们要访问struct变量内的具体某个成员,则可以使用“.”,比如访问上面例子中p3的名字:
p3.name
这里请注意struct内成员的可见性,上面的代码仅当与Person的定义在同一包内时才不会报错。
结构体作为复合结构也是值传递的,所以在使用结构体的时候一定要注意与指针的结合,使用指针来传递可以提高效率,避免数值的复制。
结构体指针的定义非常简单,就是在struct类型前面加上“*”,比如:
var pp *Person
pp就是Person这个struct指针类型的变量,上面例子中的pp是nil值。结构体指针本质上就是指针,所以其默认初始值是nil。如果在上例中调用pp.name则会报错,因为此时的pp还没有初始化。
注意
结构体指针必须初始化以后才可以使用,因为如果仅仅声明结构体指针类型变量,其默认初始值是nil。