Runner
var complete chan error = make(chan error)
var interrupt chan os.Signal = make(chan os.Signal, 1)
func genNil() error {
time.Sleep(time.Second)
fmt.Println("finish")
complete <- nil
return nil
}
func main() {
signal.Notify(interrupt, os.Interrupt)
go genNil()
select {
case err, ok := <-complete:
fmt.Printf("%v", err)
fmt.Printf("%v", ok)
case <-interrupt:
signal.Stop(interrupt)
}
}
可以看出,对于非缓存通道传入nil后,接受nil,ok为true。
var interrupt chan os.Signal = make(chan os.Signal, 1)
通道interrupt为缓存为1的信号量通道,根据signal文档中的描述,runtime是非阻塞写入信号量通道的,也就是说,如果该通道中已经满了,后续的信号会被丢弃。
后记
之前一直在优快云上写文章,后面会逐步转换到简书上,还请大家多多支持。