利用chan struct{}实现信号通道

有时,您不是想通过通道发送数据,而只想发送一个表示某种事件的信号。
这种情况下您可以使用chan struct{}来记录,经过通道发送的数值没有任何实际含义。
信号量通道通常用来通知协程结束。
package main
import (
"fmt"
)
func worker(ch chan int, chQuit chan struct{}) {
for {
select {
case v := <-ch:
fmt.Printf("Got value %d\n", v)
case <-chQuit:
fmt.Printf("Signalled on quit channel. Finishing\n")
chQuit <- struct{}{}
return
}
}
}
func main() {
ch, chQuit := make(chan int), make(chan struct{})
go worker(ch, chQuit)
ch <- 3
chQuit <- struct{}{}
// wait to be signalled back by the worker
<-chQuit
}
-----------Output----------------
Got value 3
Signalled on quit channel. Finishing