结论:

1. 遍历一个未关闭的channel会造成死循环

2. 即使关闭了一个非空通道,我们仍然可以从通道里面接收到未读取的数据

3. 可以这样理解,close()函数会往channel中压入一条特殊的通知消息,可以用来通知channel接收者不会再收到数据。所以即使channel中有数据也可以close()而不会导致接收者收不到残留的数据

4. channel不需要通过close释放资源,只要没有goroutine持有channel,相关资源会自动释放

实验如图(上面是未执行close()的,造成死锁;下面是执行了close()的,正常遍历结束):

go 关闭通道的必要性_死循环

代码如下:

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)
}
}