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
Just try, don't shy.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现