首先提出个小问题,Go语言中什么变量的大小是0字节的?
是空结构体
- 空结构体的地址均相同(当不被包含在其他结构体中时)
type kong struct {
}
type kong_ struct {
kong
name string
}
func emptyStruct() {
a := kong{}
b := 2
c := kong_{}
d := kong{}
fmt.Printf("空结构体a的大小:%d,空结构体的地址:%p\n",
unsafe.Sizeof(a), &a)
fmt.Printf("变量b的地址:%p\n", &b)
fmt.Printf("非独立结构体c的大小:%d,非独立空结构体的地址:%p\n",
unsafe.Sizeof(c), &c.kong)
fmt.Printf("空结构体d的大小:%d,空结构体d的地址:%p\n",
unsafe.Sizeof(d), &d)
/*
结果:
空结构体a的大小:0,空结构体的地址:0xdc9540
变量b的地址:0xc00001c098
嵌套结构体c的大小:16,嵌套后空结构体的地址:0xc000062250
空结构体d的大小:0,空结构体d的地址:0xdc9540
结论:
所有独立的空结构体都具有相同的地址,这个地址叫zeroBase,且该空结构体的大小为0
*/
}
- 空结构体主要是为了节省内存
- 结合map
func implHashSet() { //hashset是只有k无v的数据结构 //使用map实现hashset m := map[string]struct{}{} m["xxj"] = struct{}{} fmt.Println(m) /* 结果:map[xxj:{}] */ }
- 结合channel
func implPureMes() { //传递空信息(纯信号),在不需要实际意义的信息时可以优化内存的占用 pureMess := make(chan struct{}) fmt.Println(pureMess) }
小结:
- 空结构体不占用空间
- 空结构体与map结合可以实现hashset
- 空结构体与channel结合可以当作纯信号