Go 知识点(07)— 对已经关闭通道进行读写
今天我们来看下对已经关闭通道进行读写会发生什么情况。
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)— 对已经关闭通道进行读写相关推荐
- Go 学习笔记(25)— 并发(04)[有缓冲/无缓冲通道、WaitGroup 协程同步、select 多路监听通道、close 关闭通道、channel 传参或作为结构体成员]
1. 无缓冲的通道 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道. 这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能 ...
- c语言打开关闭文件的顺序,C语言1-文件概述、文件的打开与关闭、顺序读写数据文件(1).docx...
C语言程序设计教案 章节名称 文件概述.文件的打开与关闭.顺序读写数据文件(1) 授课类型 □理论 □实验 ?理实一体 □实训 □实习 班级 地点 周次 星期 节次 授课进度 ?符合 □超前 □滞后 ...
- go 关闭通道的必要性
结论: 1. 遍历一个未关闭的channel会造成死循环 2. 即使关闭了一个非空通道,我们仍然可以从通道里面接收到未读取的数据 3. 可以这样理解,close()函数会往channel中压入一条特殊 ...
- java关闭通道_调用map方法后,Java 7文件通道未正确关闭
我正在研究一个sc2replay解析工具.我在MPQLIB http://code.google.com/p/mpqlib/之上构建它 不幸的是,该工具使用文件通道来读取bzip文件, 并使用map( ...
- 客户端关闭服务器收到消息推送消息,【网络编程】——WebSocket打开和关闭通道,消息发送...
HTML5给Web浏览器带来了全双工TCP链接WebSocket标准服务器的能力.浏览器和可以与服务器创建链接,经过已创建的通讯信道来发送和接收数据而不须要由HTTP协议入额外的开销.javascri ...
- 《系统集成项目管理工程师》必背100个知识点-07项目建议书的内容
项目建议书的内容? ▲▲▲ (1)项目简介 (2)项目建设单位概括 (3)项目建设的必要性 (4)业务分析 (5)总体建设方案 (6)本期项目建设方案 (7)环保.消防.职业安全 (8)项目实施进度 ...
- 软考知识点---07计算机网络
目录 一.网络的基本概念 (一)计算机网络的发展 (二)计算机网络的主要功能 (三)计算机网络的分类 1.通信子网(信息传输) 2.资源子网(数据处理.提供网络资源) 3.通信子网和资源子网的关系如下 ...
- 河北专接本微机原理知识点07
微机原理 第七章 可编程接口芯片 一.并行和串行通信 并行通信 串行通信 异步通信 同步通信 通信电路的连接方式 二.可编程并行接口芯片8255A 8255A的内部结构和引脚 与外设链接的端口 与处理 ...
- 文件操作——打开关闭、顺序读写、随机读写
文件 文件功能的角度来分类 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe) 数据文件 文件的内容不一定是程序,而是 ...
最新文章
- windows环境下安装neo4j
- shiro放行_Shiro框架详解 tagline
- geo数据差异分析_GeoDiver:GEO数据挖掘分析利器
- 成为一名优秀的程序员基本要素
- 最牛营业部——国信泰然九路揭秘
- LeetCode之Maximum Depth of Binary Tree
- php 留言板分页显示,php有分页的留言板,留言成功后怎么返回当前页?
- 城市天际线 android,都市天际线安卓手机版
- 幽灵漏洞(Ghost gethost)
- 计算机图形学笔记(第二周)
- python连接sql server
- DR、BDR和DROther的关系之通俗演绎
- 课堂随笔01--进制转换
- 电商直播数据的简单总结
- python批量切换图片格式的方法
- 专升本C语言知识点笔记
- 小球落体计算机模拟思路,使用CSS3动画模拟实现小球自由落体效果
- python爬取千图网图片(出现HTTP Error 403怎么解决)
- 最佳实践(2):iOS开发篇
- 开始创建第一个npm的微信小程序项目
热门文章
- 2022-2028年中国铪行业市场研究及前瞻分析报告
- 2022-2028年中国工业环保产业投资分析及前景预测报告
- 2022-2028年中国PVC糊树脂行业市场深度分析及市场规模预测报告
- LeetCode简单题之二进制表示中质数个计算置位
- LeetCode简单题之删除某些元素后的数组均值
- TensorRT 7.2.1开发初步
- Python分析离散心率信号(上)
- linux 6.4 图形界面,为CentOS 6.4安装图形界面并用VNC远程连接
- Python 算术运算符
- Python TypeError: ‘int‘ object is not iterable