Go语言中提供了对struct的支持,struct
,中文翻译称为结构体
,与数组一样,属于复合类型,并非引用类型。
Go语言的struct,与C语言中的struct或其他面向对象编程语言中的类(class)类似,可以定义字段(属性)和方法,但也有很不同的地方,需要深入学习,才能区分他们之间的区别。
注意复合类型与引用类型之间的区别,这应该也是值传递和引用传递的区别吧。
定义
使用struct关键字可以定义一个结构体,结构体中的成员,称为结构体的字段或属性。
type Member struct {
id int
name, email string
gender, age int
}
复制代码
上面的代码中,我们定义了一个包含5个字段的结构体,可以看到,相同类型name
和email
、gender
和age
在同一行中定义,但比较好的编程习惯是每一行只定义一个字段,如:
type Member struct {
id int
name string
email string
gender int
age int
}
复制代码
当然,结构体也可以不包含任何字段,称为空结构体
,struct{}表示一个空的结构体,注意,直接定义一个空的结构体并没有意义,但在并发编程中,channel之间的通讯,可以使用一个struct{}作为信号量。
ch := make(chan struct{})
ch <- struct{}{}
复制代码
使用
上面的例子中,我们定义了Member结构体类型,接下就可以这个自定义的类型创建变量了。
直接定义变量,这个使用方式并没有为字段赋初始值,因此所有字段都会被自动赋予自已类型的零值,比如
name
的值为空字符串"",age的值为0。
var m1 Member//所有字段均为空值
复制代码
使用字面量创建变量,这种使用方式,可以在大括号中为结构体的成员赋初始值,有两种赋初始值的方式,一种是按字段在结构体中的顺序赋值,下面代码中
m2
就是使用这种方式,这种方式要求所有的字段都必须赋值,因此如果字段太多,每个字段都要赋值,会很繁琐,另一种则使用字段名为指定字段赋值,如下面代码中变量m3
的创建,使用这种方式,对于其他没有指定的字段,则使用该字段类型的零值作为初始化值。
var m2 = Member{1,"小明","xiaoming@163.com",1,18} // 简短变量声明方式:m2 := Member{1,