文章摘要
GPT 4
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
投诉

go channel在何时关闭

go语言的channel关闭方式只有一种,那就是使用内建close方法关闭,如果不进行显示关闭的话,消费者就一直会等待

不过在使用for等待channel的时候,需要在channel中的所有数据弹出来之后才会彻底关闭channel,收回channel的资源, 例如:

1
2
3
4
5
6
7
c := make(chan int, 10)
c <- 1
c <- 2
close(c)
for i := range c {
fmt.Println(i)
}

这种情况下,还是会打印出1、2之后才结束for循环。

如何判断channel是否已经关闭

可以通过如下方式读取到channel状态:

1
i, ok := <- channel

i是channel中读取到的值,ok是bool值,表示channel是否关闭,只有一种情况ok为false,就是channel被显示close并且channel内没有数据可以被读取的时候ok才为false

如果channel内的没有值的话,读取获得的i为空,具体为那种数据类型的空主要看channel最开始怎么声明的,例如:(ch := make(chan int),空值为0)

那么我们可不可以通过i的值来判断是否channel已经关闭了呢?

当然不可以,因为空值也可能是生产者主动发的,所以要使用ok来判断。