结论:
1. 遍历一个未关闭的channel会造成死循环
2. 即使关闭了一个非空通道,我们仍然可以从通道里面接收到未读取的数据
3. 可以这样理解,close()函数会往channel中压入一条特殊的通知消息,可以用来通知channel接收者不会再收到数据。所以即使channel中有数据也可以close()而不会导致接收者收不到残留的数据
4. channel不需要通过close释放资源,只要没有goroutine持有channel,相关资源会自动释放
实验如图(上面是未执行close()的,造成死锁;下面是执行了close()的,正常遍历结束):
代码如下:
package main
import "fmt"
func main() {
ch := make(chan int, 10)
ch <- 1
ch <- 2
ch <- 3
// 关闭函数非常重要,若不执行close(),那么range将无法结束,造成死循环
// close(ch)
for v := range ch {
fmt.Println(v)
}
}