使用close()关闭channel
对于channel来说可以使用for range语法来不断地读值,但是如果当全部值已经读取完毕之后,for range就会阻塞。这个时候我们可以使用close(),来手动的关闭channel,此时for range就会退出了。
例如:
func main() {
var msg chan int
var wg sync.WaitGroup
wg.Add(1)
msg = make(chan int, 3)
go func(msg chan int) {
defer wg.Done()
for data := range msg {
fmt.Println(data)
}
fmt.Println("所有消息都读完啦!")
}(msg)
for i := 0; i < 3; i ++ {
msg <- i;
}
close(msg)
wg.Wait()
}
运行结果如下:
0
1
2
所有消息都读完啦!
有一个需要注意的地方,对于一个close了的channel来说可以继续读值,但是不能向里写值