当前位置: 首页 > news >正文

当 Go 的 channel 被 close 后读写操作会怎么样?

在这里插入图片描述

当 Go 的 channel 被 close 后,对它的读操作行为有以下明确规则:


重点行为总结

操作行为
从已关闭且仍有缓存数据的 channel 读会正常返回该数据
从已关闭且缓冲区数据已读完的 channel 读返回 零值(基于类型)和 ok=false
向已关闭的 channel 写数据❌ 直接 panic

如果 channel 没有缓冲 和有缓冲的读完数据后的操作是一样的结果


示例代码

ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)v, ok := <-ch // v=1, ok=true
v, ok = <-ch // v=2, ok=true
v, ok = <-ch // v=0, ok=false

range 遍历已关闭 channel

当你使用 range 遍历 channel 时,它会一直读到 channel 关闭且数据读完后才退出循环:

for v := range ch {fmt.Println(v)
}
fmt.Println("done")

零值返回示例

如果 channel 是 chan string,零值读出来就是 ""
如果是 chan *User,零值就是 nil


为什么要设计成这样?

  • 避免读端阻塞
  • 让接收端可以用 ok 判断数据是否结束
  • 使 channel 更像是一个有限流(stream)

典型使用场景

生产者关闭 channel 通知消费者不再有新数据

func producer(out chan<- int) {defer close(out)for i := 0; i < 5; i++ {out <- i}
}func consumer(in <-chan int) {for v := range in {fmt.Println(v)}
}

常见误区

误区实际情况
close 后读会 panic❌ 永远不会 panic
必须由接收方 close❌ 通常是发送方 close
close 可重复调用❌ 重复 close 会 panic

完整示例代码

package mainimport ("fmt"
)func main() {ch := make(chan int, 3)// Producergo func() {for i := 0; i < 5; i++ {ch <- i}close(ch) // 通知消费者:不再有新数据}()// Consumerfor v := range ch { // 会一直读到 ch 被关闭 & 数据读完fmt.Println("received:", v)}fmt.Println("done") // 会执行,因为 range 自动退出
}

输出示例(顺序可能不同)

received: 0
received: 1
received: 2
received: 3
received: 4
done
http://www.dtcms.com/a/542481.html

相关文章:

  • scratch统计字符 2025年6月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析
  • 【算法】——动态规划之01背包问题
  • 烟台企业网站开发企业做网站的合同
  • 设计上海网站越来越多大学生喜欢虚拟空间
  • 用文件传输协议登录网站做网页制作怎么样
  • 网站改版案例成都二次感染最新消息
  • 简洁大气的网站设计个人网站可以做推广不
  • 计网4.3 IPV6地址
  • 网站建设制作解决方案丽水微信网站建设哪家好
  • 个人网站设计案例游戏网站建设网
  • 苏州网络网站建设网站手机端页面怎么做的
  • 免费网站申请注册软装素材网站有哪些
  • 英一2014年真题学习笔记
  • 利用装饰器对函数参数强制执行类型检查:Python高级技巧详解
  • 网站seo优化是什么意思wordpress 自定义主题
  • 网站建设谁家好建设网上商城网站
  • SR-Scientist: 利用 ai agent 进行科学公式的发现
  • 5.虚拟化技术(二)
  • 档案信息网站建设的意义注册会计师考试科目
  • 帮企业建设网站和推广网站怎么导入模板到wordpress
  • 专门做奢侈品的网站网络营销策略的内容
  • phpmysql网站开发项目式教程苏州网站seo优化
  • Linux回环设备:块与网络驱动全解析
  • linux学习--总线设备驱动模型
  • 佛山 网站建设培训班成品app直播源码
  • 开发网站和application2019做网站图片用什么格式
  • OpenHarmony内核中HDF内核态驱动khdf编译流程
  • 旅游商城网站订单处理网站建设所需美工
  • 深圳学校网站建设公司网站首页列表布局设计
  • 网站降权了怎么办虾皮购物网站怎么做