package main

import (
"fmt"
)

func main() {
//无缓冲,将会阻塞在接收数据
c := make(chan int)
go func() {
for i := 0; i < 5; i++ {
c <- i
}
//把 close(c) 注释掉,程序会一直阻塞在 if data, ok := <-c; ok 那一行
close(c)
}()

for {
//ok为true说明channel没有关闭,为false说明管道已经关闭
if data, ok := <-c; ok {
fmt.Println(data)
} else {
break
}
}

fmt.Println("Finished")
}

如果发送者知道,没有更多的值需要发送到channel的话,那么让接收者也能及时知道没有多余的值可接收将是有用的,因为接收者可以停止不必要的接收等待。这可以通过内置的close函数来关闭channel实现。

注意:

l channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的,才去关闭channel;

l 关闭channel后,无法向channel 再发送数据(引发 panic 错误后导致接收立即返回零值);

l 关闭channel后,可以继续从channel接收数据;

l 对于nil channel,无论收发都会被阻塞。