- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
10.4 重温 Channel(通道)
一旦掌握了 select
关键字,Go channels 可以以几种独特的方式做更多事要比您在第9章(并发-Goroutines,Channel和Pipeline)学到的。这节将揭晓 Go channels 的这些使用方法。
要记住 channel 类型的零值是 nil
,并且如果您发送一个消息给以关闭的 channel,程序将崩溃。然而,如果您尝试从已关闭的 channel 读取的话,会得到 channel 类型的零值。因此,关闭 channel 后,您不能再往里写,但您能一直读。
为了能关闭 channel, channel 不必是只接受。另外,一个 nil
channel 总是阻塞的。channels 的这个特性非常有用,当您想要禁用 select
表达式的一个分支时,可以分配一个 nil
值给一个 channel 变量。
最后,如果您要关闭一个 nil
channel,程序就会崩溃。最好的说明是下面这个 closeNilChannel.go
程序:
package main
func main() {
var c chan string
close(c)
}
执行 closeNilChannel.go
产生如下输出:
$go run closeNilChannel.go
panic: close of nil channel
goroutine 1 [running]:
main.main()
/Users/mtsouk/closeNilChannel.go:5 +0x2a
exit status 2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论