概述
下面表格中的内容是 Go 语言中 channel
数据类型的使用规则,相信读者已经可以熟练掌握,本文主要分析 channel
的内部实现中的数据结构和算法,所以相关的基础概念会直接跳过, 希望读者阅读完本文后,可以深入理解表格中的各类规则,从应用层代码到底层实现,能够知其然并知其所以然。
操作规则
操作 | nil | 已关闭的 channel | 未关闭有缓冲区的 channel | 未关闭无缓冲区的 channel |
---|---|---|---|---|
关闭 | panic | panic | 成功关闭,然后可以读取缓冲区的值,读取完之后,继续读取到的是 channel 类型的默认值 | 成功关闭,之后读取到的是 channel 类型的默认值 |
接收 | 阻塞 | 不阻塞,读取到的是 channel 类型的默认值 | 不阻塞,正常读取值 | 阻塞 |
发送 | 阻塞 | panic | 不阻塞,正常写入值 | 阻塞 |
编译规则
操作 | ||
---|---|---|
接收 | 只写 channel | 编译错误 |
发送 | 只读 channel | 编译错误 |
关闭 | 只读 channel | 编译错误 |