【golang】go 空结构体 详解 空结构体内容占用及大小
一、空结构体基础
空结构实例 和 空结构体变量 本质是一样的
- 1、所有空结构体地址都是一样的
- 2、大小都为0(最独特的)
package mainimport ("fmt""time""unsafe"
)type EST struct {
}func main() {// 一、基础// 空结构实例 和 空结构体变量 本质是一样的// 1、所有空结构体地址都是一样的// 2、大小都为0(最独特的)var a ESTvar b struct{}fmt.Printf("a address %p, size %d \n", &a, unsafe.Sizeof(a))fmt.Printf("b address %p, size %d \n", &b, unsafe.Sizeof(b))if a == b {fmt.Println("......")}
}
输出结果:
a address 0x10030c028, size 0
b address 0x10030c028, size 0
…
二、应用场景一 充当 set
package mainimport ("fmt""time""unsafe"
)type EST struct {
}func main() {// 二、应用场景一:充当 setset := make(map[string]interface{}, 10)set["A"] = EST{}set["B"] = struct{}{}fmt.Println(len(set))for k, _ := range set {fmt.Println(k)}
}
三、应用场景二 协程阻塞
1、协程阻塞的三种方式
- 1、一种是通过 waitGroup:通过调wait函数把本协程阻塞掉
- 2、通过 time.Sleep()
- 3、使用 管道 channel 读写阻塞
2、channel方式阻塞 main
package mainimport ("fmt""time""unsafe"
)type EST struct {
}func main() {// 三、应用场景二:协程阻塞// 1、一种是通过 waitGroup:通过调wait函数把本协程阻塞掉// 2、通过 time.Sleep()// 3、使用 管道 channel 读写阻塞// 下面展示为channel方式阻塞 mainctra := make(chan EST, 0)go func() {time.Sleep(3 * time.Second)fmt.Println("等待子协程执行完成!!!")ctra <- EST{}}()fmt.Println("---------")<-ctra
}