Go語言struct{}型別的channel
阿新 • • 發佈:2018-12-31
簡介
在Go語言中,有一種特殊的struct{}
型別的channel
,它不能被寫入任何資料,只有通過close()
函式進行關閉操作,才能進行輸出操作。。struct
型別的channel
不佔用任何記憶體!!!
定義:
var sig = make(chan struct{})
解除方式:
package main
func main() {
var sig = make(chan struct{})
close(sig) // 必須進行close,才能執行<-sig,否則是死鎖
<-sig
}
應用
等待某任務的結束:
done := make (chan struct{})
go func() {
doLongRunningThing()
close(done)
}()
// do some other bits
// wait for that long running thing to finish
<-done
// do more things
有很多方式可以完成這種操作,這是其中一個。。
同一時刻啟動多個任務:
start := make(chan struct{})
for i := 0; i < 10000; i++ {
go func() {
<-start // wait for the start channel to be closed
doWork(i) // do something
}()
}
// at this point, all goroutines are ready to go - we just need to
// tell them to start by closing the start channel
close(start)
這是真正意義上的同一時刻,不再是併發,是並行。。。
停止某事件:
loop:
for {
select {
case m := <-email:
sendEmail(m)
case <-stop: // triggered when the stop channel is closed
break loop // exit
}
}
一旦關閉了stop
,整個迴圈就會終止。這在Golang的官方包io.pipe
中有應用