Golang channel关闭后是否可以读取剩余的数据详解
golang channel关闭后,其中剩余的数据,是可以继续读取的。
请看下面的测试例子。
创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channel中读取数据,输出结果。
package main import ( "fmt" ) func main(){ ch := make(chan int, 3) ch <-1 ch <-2 ch <-3 close(ch) for value := range ch { fmt.Println("value:", value) } }
output:
value: 1
value: 2
value: 3
可以看到,channel关闭之后,仍然可以从channel中读取剩余的数据,直到数据全部读取完成。
多说一点,对于一个关闭的channel,如果继续向channel发送数据,会引起panic。
如果继续读数据,得到的是零值(对于int,就是0)。
判断一个channel的方式有两种:
一种方式:
value, ok := <- ch
ok是false,就表示已经关闭。
另一种方式,就是上面例子中使用的方式:
for value := range ch { }
如果channel被关闭,会跳出循环。
另外,如果channel被关闭后,不能再写入,写入会导致panic。但可以一直读取,读取到的值是类型的零值:
for i:=0;i<10;i++ { value := <- ch fmt.Println("value:", value) }
value: 1
value: 2
value: 3
value: 0
value: 0
value: 0
value: 0
value: 0
value: 0
value: 0
到此这篇关于Golang channel关闭后是否可以读取剩余的数据详解的文章就介绍到这了,更多相关Golang channel关闭内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Golang 中的可测试示例函数(Example Function)详解
这篇文章详细讲解了 Golang 中的可测试示例函数,示例函数类似于单元测试函数,但没有 *testing 类型的参数,编写示例函数也是很容易的,本文就通过代码示例给大家介绍一下Golang的可测试示例函数,需要的朋友可以参考下2023-07-07
最新评论