package main import ( "fmt" "unsafe" ) func main() { empStruct() } //空结构体的实例和作用 func empStruct(){ //空结构体的特点:1、不占用内存;2、地址不变 var s struct{} var s1 struct{} fmt.Println("空结构体占用内存的情况:",unsafe.Sizeof(s)) fmt.Printf("空结构体指针指向情况:s = %p, s1 = %p,两个指针的比较结果:%v",&s,&s1,&s==&s1) strChan := make(chan string,3) signChan := make(chan struct{},1) //接收数据信号 signChan1 := make(chan struct{},2) //操作完成信号 go func(){ // 用来接收信息 <- signChan //阻塞协程,直到signChan接收到值 for value := range strChan{ fmt.Println("接收到值为:",value) } signChan1 <- struct{}{} }() go func(){ // 模拟发送数据 for index,value := range []string{"1","2","3"}{ fmt.Println("发送数据:",value) strChan <- value if index==2{ signChan <- struct{}{} } } close(strChan) signChan1 <- struct{}{} }() fmt.Println("等待上面连个协程运行结束") <- signChan1 <- signChan1 //阻塞,直到上面两个协程完成 }
输出如下
空结构体占用内存的情况: 0 空结构体指针指向情况:s = 0x58ccd8, s1 = 0x58ccd8,两个指针的比较结果:true等待上面连个协程运行结束 发送数据: 1 发送数据: 2 发送数据: 3 接收到值为: 1 接收到值为: 2 接收到值为: 3
- 空结构体的特点
- 不占用内存
- 地址不变
- 空结构体作用
- 建议用于传递信号的通道,因为不占用内存