1. 程式人生 > >Go語言struct{}型別的channel

Go語言struct{}型別的channel

簡介

在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中有應用

參考部落格