今天我们来看下对已经关闭通道进行读写会发生什么情况。

1. 对已关闭通道进行写操作

看下面代码会输出什么结果?

func main() {ch := make(chan string, 1)close(ch)ch <- "hello, world"fmt.Println(<-ch)
}

输出结果为:

panic: send on closed channel

这个结果无论对于非缓冲通道还是缓冲通道都是一样的,即对已经关闭的通道进行写操作,会触发 panic

2. 对已关闭通道进行读操作

对已经关闭的 channel 进行读操作要分为两种情况:

  • 已关闭的 channel 没有数据;
  • 已关闭的 channel 仍然有数据;

2.1 已关闭的 channel 没有数据

看下面代码

func main() {ch := make(chan int, 1)close(ch)// 第一次从通道中获取数据value, ok := <-chfmt.Println(value) // 0fmt.Println(ok)    //  false// 第二次从通道中获取数据fmt.Printf("<-ch is %v\n", <-ch) // <-ch is 0fmt.Println(ok)                  //  false
}

从上面代码结果我们可以得出结论,对于已经关闭的 channel ,如果通道内已经没有数据,那么可以不限次数的进行读取操作,但是读到的值是该 channel 类型的零值,也就是上面代码中 int 的零值 0。

如果该通道被声明为 string 类型,那么其零值就为空字符串 ""

而从通道返回的第二个值,也就是标志位 ok,则会一直为 false

2.2 已关闭的 channel 仍然有数据

查看下面代码输出结果

func main() {ch := make(chan int, 3)ch <- 1close(ch)// 第一次从通道中获取数据value, ok := <-chfmt.Println("第一次从通道中获取数据 value", value) //  1fmt.Println("第一次从通道中获取数据 ok", ok)       //  true// 第二次从通道中获取数据value, ok = <-chfmt.Println("第二次从通道中获取数据 value", value) //  0fmt.Println("第二次从通道中获取数据 ok", ok)       //  false
}

对于这种情况,从通道里面仍然可以获取到之前存储的数据,同时第二个返回值 ok 的值为 true, 表示通道里面是有数据的。

但是当通道里面的值被取完时,就和上面 2.1 小节的结果一样了。

3. 对通道操作的总结


Go 知识点(07)— 对已经关闭通道进行读写相关推荐

  1. Go 学习笔记(25)— 并发(04)[有缓冲/无缓冲通道、WaitGroup 协程同步、select 多路监听通道、close 关闭通道、channel 传参或作为结构体成员]

    1. 无缓冲的通道 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道. 这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能 ...

  2. c语言打开关闭文件的顺序,C语言1-文件概述、文件的打开与关闭、顺序读写数据文件(1).docx...

    C语言程序设计教案 章节名称 文件概述.文件的打开与关闭.顺序读写数据文件(1) 授课类型 □理论 □实验 ?理实一体 □实训 □实习 班级 地点 周次 星期 节次 授课进度 ?符合 □超前 □滞后 ...

  3. go 关闭通道的必要性

    结论: 1. 遍历一个未关闭的channel会造成死循环 2. 即使关闭了一个非空通道,我们仍然可以从通道里面接收到未读取的数据 3. 可以这样理解,close()函数会往channel中压入一条特殊 ...

  4. java关闭通道_调用map方法后,Java 7文件通道未正确关闭

    我正在研究一个sc2replay解析工具.我在MPQLIB http://code.google.com/p/mpqlib/之上构建它 不幸的是,该工具使用文件通道来读取bzip文件, 并使用map( ...

  5. 客户端关闭服务器收到消息推送消息,【网络编程】——WebSocket打开和关闭通道,消息发送...

    HTML5给Web浏览器带来了全双工TCP链接WebSocket标准服务器的能力.浏览器和可以与服务器创建链接,经过已创建的通讯信道来发送和接收数据而不须要由HTTP协议入额外的开销.javascri ...

  6. 《系统集成项目管理工程师》必背100个知识点-07项目建议书的内容

    项目建议书的内容? ▲▲▲ (1)项目简介 (2)项目建设单位概括 (3)项目建设的必要性 (4)业务分析 (5)总体建设方案 (6)本期项目建设方案 (7)环保.消防.职业安全 (8)项目实施进度 ...

  7. 软考知识点---07计算机网络

    目录 一.网络的基本概念 (一)计算机网络的发展 (二)计算机网络的主要功能 (三)计算机网络的分类 1.通信子网(信息传输) 2.资源子网(数据处理.提供网络资源) 3.通信子网和资源子网的关系如下 ...

  8. 河北专接本微机原理知识点07

    微机原理 第七章 可编程接口芯片 一.并行和串行通信 并行通信 串行通信 异步通信 同步通信 通信电路的连接方式 二.可编程并行接口芯片8255A 8255A的内部结构和引脚 与外设链接的端口 与处理 ...

  9. 文件操作——打开关闭、顺序读写、随机读写

    文件 文件功能的角度来分类 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe) 数据文件 文件的内容不一定是程序,而是 ...

最新文章

  1. windows环境下安装neo4j
  2. shiro放行_Shiro框架详解 tagline
  3. geo数据差异分析_GeoDiver:GEO数据挖掘分析利器
  4. 成为一名优秀的程序员基本要素
  5. 最牛营业部——国信泰然九路揭秘
  6. LeetCode之Maximum Depth of Binary Tree
  7. php 留言板分页显示,php有分页的留言板,留言成功后怎么返回当前页?
  8. 城市天际线 android,都市天际线安卓手机版
  9. 幽灵漏洞(Ghost gethost)
  10. 计算机图形学笔记(第二周)
  11. python连接sql server
  12. DR、BDR和DROther的关系之通俗演绎
  13. 课堂随笔01--进制转换
  14. 电商直播数据的简单总结
  15. python批量切换图片格式的方法
  16. 专升本C语言知识点笔记
  17. 小球落体计算机模拟思路,使用CSS3动画模拟实现小球自由落体效果
  18. python爬取千图网图片(出现HTTP Error 403怎么解决)
  19. 最佳实践(2):iOS开发篇
  20. 开始创建第一个npm的微信小程序项目

热门文章

  1. 2022-2028年中国铪行业市场研究及前瞻分析报告
  2. 2022-2028年中国工业环保产业投资分析及前景预测报告
  3. 2022-2028年中国PVC糊树脂行业市场深度分析及市场规模预测报告
  4. LeetCode简单题之二进制表示中质数个计算置位
  5. LeetCode简单题之删除某些元素后的数组均值
  6. TensorRT 7.2.1开发初步
  7. Python分析离散心率信号(上)
  8. linux 6.4 图形界面,为CentOS 6.4安装图形界面并用VNC远程连接
  9. Python 算术运算符
  10. Python TypeError: ‘int‘ object is not iterable