结构体是由一些列属性组成的复合数据类型,每个属性都具有名称、类型和值,结构体将属性组合在一起进行由程序进行处理
自定义类型
在go语言中使用type声明一种新的类型,语法格式为:
Format可以时任意内置类型、函数签名、结构体、接口
定义
结构体定义使用struct标识,需要指定其包含的属性(名和类型),在定义结构体时可以为结构体指定结构体名(命名结构体),用于后续声明结构体变量使用
声明
声明结构体变量只需要定义变量类型为结构体名,变量中的每个属性被初始化为对应类型的零值。也可声明结构体指针变量,此时变量被初始化为nil
初始化
使用结构体创建的变量叫做对应结构体的实例或者对象
-
使用结构体零值初始化结构体值对象
-
使用结构体字面量初始化结构体值对象
-
使用new函数进行初始化结构体指针对象
-
使用结构体字面量初始化结构体指针对象
New函数
Go语言中常定义N(n)ew+结构体名命名的函数用于创建对应的结构体值对象或指针对象
属性的访问和修改
通过结构体对象名/结构体指针对象.属性名的方式来访问和修改对象的属性值
可以通过结构体指针对象的点操作直接对对象的属性值进行访问和修改
匿名结构体
在定义变量时将类型指定为结构体的结构,此时叫匿名结构体。匿名结构体常用于初始化一次结构体变量的场景,例如项目配置
命名嵌入
结构体命名嵌入是指结构体中的属性对应的类型也是结构体
定义
声明和初始化
属性的访问和修改
匿名嵌入
结构体匿名嵌入是指将已定义的结构体名直接声明在新的结构体中,从而实现对以后已有类型的扩展和修改
定义
声明&初始化
在初始化匿名嵌入的结构体对象时需要遵循树状声明的结构,对于匿名嵌入的结构体可以使用结构体名来指定初始化参数
属性访问和修改
在访问和修改嵌入结构体的属性值时,可以通过对象名.结构体名称.属性名的方式进行访问和修改,结构体名称可以省略(匿名成员有一个隐式的名称),因此不能嵌套两个相同名称的结构体。当被嵌入结构体和嵌入结构体有相同的属性名时,在访问和修改嵌入结构体成员的属性值时不能省略结构体名称
指针类型嵌入
结构体嵌入(命名&匿名)类型也可以为结构体指针
定义
声明&初始化&操作
使用属性为指针类型底层共享数据结构,当底层数据发生变化,所有引用都会发生影响
使用属性为值类型,则在复制时发生拷贝,两者不相互影响
可见性
结构体首字母大写则包外可见(公开的),否者仅包内可访问(内部的)
结构体属性名首字母大写包外可见(公开的),否者仅包内可访问(内部的)
组合:
- 结构体名首字母大写,属性名大写:结构体可在包外使用,且访问其大写的属性名
- 结构体名首字母大写,属性名小写:结构体可在包外使用,且不能访问其小写的属性名
- 结构体名首字母小写,属性名大写:结构体只能在包内使用,属性访问在结构体嵌入时由被嵌入结构体(外层)决定,被嵌入结构体名首字母大写时属性名包外可见,否者只能在包内使用
- 结构体名首字母小写,属性名小写:结构体只能在包内使用