1、结构体是将零个或者多个任意类型的命名变量组合在一起的聚合数据类型。
1:空结构体的长度是多少?
package main
import "fmt"
import "unsafe"
func main() {
fmt.Println(unsafe.Sizeof(struct{}{}))
}
测试输出: 0
没有任何成员变量的结构体称为空结构体,写作:struct{} 可用在只有key有用的map中作为value节省内存(不推荐使用 – 节省不了多少内存 & 语法复杂) struct{}是一个空类型,struct{}{}是空类型的实例
2: 内存对齐的表现?
package main
import "fmt"
import "unsafe"
type A struct {
x byte
a int
i8 int8
}
func main() {
var a A
fmt.Println(unsafe.Sizeof(a))
}
测试输出: 24(int占用8字节,编译器采用8字节对齐)
2、结构体成员变量的顺序对于结构体的同一性很重要。(互换任何变量的顺序都破坏了结构体的同一性,相当于定义了一个新的不同的结构体类型,名字不一样就算成员名字类型和顺序都一样也是不同的结构体)
3、一个结构体的成员变量首字母大写,那么这个变量是可导出的,一个结构体可同时包含可导出和不可导出的成员变量。
4、命名结构体类型不可以定义一个拥有相同结构体类型的成员变量,也就是一个聚合类型不可以包含它自己(循环嵌套,无穷无尽)。
5、如果结构体的所有成员变量都是可比较的,那么这个结构体就是可比较的(slice和map不可比较)。
6、Go允许我们定义不带名称的结构体成员,只需要指定类型即可;这种结构体成员称作匿名成员。这个结构体成员的类型必须是一个命名类型或者指向命名类型的指针。我们在访问最终需要的变量时,可以省略中间所有的匿名成员。匿名成员拥有隐式的名字,所以不能在一个结构体里面定义两个相同类型的匿名成员。可导出性也由它们的类型决定(首字母是否大写)。
type Wheel struct {
circle
}
type circle struct {
X, Y int
}
// 另一个包
var w Wheel
w.X = 8 // 编译通过
w.circle.X = 8 // 编译错误
参考文献
Go程序设计语言/(美) 艾伦 A. A. 多诺万(Alan A. A. Donovan), (美)布莱恩 W.柯尼汉(Brian W.kernighan) 著; 李道兵等译. – 北京:机械工业出版社,2017.1(2018.11重印刷)