channel取數據時未被賦值將被阻塞,可使用這一機制來完成事件的監聽函數
wg := new(sync.WaitGroup) wg.Add(2) event := make(chan bool) //函數 go func() { defer wg.Done() for i := 0; i < 5; i++ { fmt.Println("觸發事件前", i) } event <- true //觸發事件 }() go func() { <-event defer wg.Done() for i := 0; i < 5; i++ { fmt.Println("觸發事件後", i) } }() wg.Wait()
輸出:blog
觸發事件前 0
觸發事件前 1
觸發事件前 2
觸發事件前 3
觸發事件前 4
觸發事件後 0
觸發事件後 1
觸發事件後 2
觸發事件後 3
觸發事件後 4事件
在使用Channel時要注意it
若是chan的容量已滿,將會發生死鎖event
如:class
data:=make(chan int ,3) exit:=make(chan bool) data<-1 data<-2 data<-3 data<-4//運行到這裏將被阻塞,由於chan容量已滿
len返回chan中未被讀取的元素數量,cap返回緩衝區大小,close關閉當前chan變量
判斷chan是否關閉channel
for{ if d,ok:=<-data;ok}{ fmt.Println(d) }else{ break } }
單向chan:只負責接收,或者只負責發送數據
至關於分離了chan的發送和接收,將其變爲兩個便於控制的變量di
c := make(chan int, 3) var send chan<- int = c // send-only var recv <-chan int = c // receive-only send <- 1 <-recv