go结构体 | 青训营笔记

16 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。用结构体的经典案例是处理公司的员工信息,每个员工信息包含一个唯一的员工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中等等。

结构体是一种复合的数据类型,可以将多个不同类型的数据组合起来形成一个新的类型。可以通过类型别名来简化结构体类型的定义。结构体类型定义后,可以使用结构体字面值来创建结构体变量,可以通过成员名字和值进行初始化,也可以通过顺序初始化,但是顺序初始化需要记住每个成员的类型和顺序,而成员顺序的调整可能会导致代码不能编译。因此,成员名字和值的初始化更常用,可以只包含部分或全部成员的初始化,并且不需要记住成员顺序。

在Go语言中,我们可以通过关键字“type”来定义一个新的结构体类型。我们需要使用struct关键字指定结构体的名称,然后在花括号中定义结构体成员的名称和类型。在结构体类型定义后,我们可以用这个类型来声明变量。通过点操作符可以访问结构体的成员。

结构体成员的顺序和大小有很重要的意义。在定义结构体时,我们通常会将相关的成员放在一起。如果结构体成员的名字是以大写字母开头的,那么该成员就是导出的;这是Go语言导出规则决定的。一个结构体可能同时包含导出和未导出的成员。

Go语言中的结构体类型通常很冗长,因为每个成员都可能占用一行。虽然我们每次都可以重写整个结构体成员,但是重复会令人厌烦。因此,完整的结构体写法通常只在类型声明语句的地方出现。

一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身。但是S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等。在Go语言中,使用一个二叉树来实现插入排序非常方便。

结构体可以作为函数的参数和返回值,可以通过指针的方式传递较大的结构体,以提高效率。如果要在函数内部修改结构体成员,必须使用指针传递,因为在 Go 语言中,所有函数参数都是值拷贝传入的,函数参数将不再是函数调用时的原始变量。

当结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用 == 或 != 运算符进行比较。可比较的结构体类型和其他可比较的类型一样,可以用于 map 的 key 类型。

Go 语言提供了一种特殊的结构体嵌入机制,让一个命名类型的成员作为另一个结构体的成员来使用,称为匿名成员。通过匿名成员,可以轻松地继承一个结构体的成员,而不需要显式地定义接口。可以通过点号访问匿名成员,也可以通过类型名来访问匿名成员。此外,Go 语言还支持嵌套结构体,即在结构体中嵌套结构体。