空結構體的特點和作用
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