利用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

最后更新于