结构体是将零个或者多个任意类型的命名变量组合在一起的聚合数据类型
类型定义
最常用的方法是使用关键字struct来创建一个结构
成员变量的顺序对于结构体同一性很重要。如果我们将也是字符串类型的Name和Address组合在一起或者互换了Name和Email的顺序,那么我们就在定义一个不同的结构体类型。一般来讲,我们只组合相关的成员变量
注意: 任何时候,创建一个变量并初始化为其零值,习惯是使用关键字var。这种用法是为了更明确地表示一个变量被设置为零值。如果变量被初始化为某个非零值,就配置结构字面量和短变量声明操作符来创建变量:
|
|
|
|
出于效率考虑,大型的结构体通常都使用结构体指针的方式直接传递给函数或者从函数中返回:
Go语言是按值调用,调用的函数接收到的是实参的一个副本,并不是实参的引用。
如果结构体的所有成员变量都可以比较,那么这个结构体就是可比较的。两个结构体的比较可以使用 == 或者 !=。其中 == 操作符按照顺序比较两个结构体变量的成员变量,所以下面的两个输出语句是等价的:
和其他可比较的类型一样,可比较的结构体类型都可以作为map的键类型:
结构体嵌套和匿名成员
|
|
变量访问:
由于结构体字面量并没有什么快捷方式来初始化结构体,以下语句会编译错误:
结构体字面量必须遵循形状类型的定义, 所以下面两种方式初始化是等价的:
|
|
这里注意副词#如何使得Printf的格式化符号%v以类似Go语法的方式输出对象,这个方式里包含了成员变量的名字
任何时候,创建一个变量并初始化为其零值,习惯是使用关键字var。这种用法是为了更明确地表示一个变量被设置为零值。如果变量被初始化为某个非零值,就配合结构字面量和短变量声明操作符来创建变量。
|
|
类型声明二
另一种声明用户定义的类型方法是,基于一个已有的类型,将其作为新类型的类型说明:
Go并不认为Duration和int64是同一种类型。这两个类型是完全不同的有区别的类型:
小结
- 使用关键字struct或者通过指定一家存在的类型,可以声明用户定义的类型
- 方法提供了一种给用户定义的类型增加行为的方式
- 设计类型时需要确认类型的本质是原始的,还是非原始的
- 接口是声明了一组行为并支持多台的类型
- 嵌入类型提供了扩展类型的功能,而无需使用继承
- 标识符要么是从包里面公开的,要么是在包里未公开的