封闭通道与零通道
Closed channel vs nil channel
我正在使用 Go 频道,我想知道关闭频道和将其设置为 nil 之间有什么区别?
编辑:
在这个example中,我想断开发送者和接收者的连接,无论是关闭通道还是设置为nil。执行此操作的最佳做法是什么?
将通道变量设置为 nil 只是将变量设置为 nil,同时保留之前初始化的通道。
这与将任何其他变量设置为 nil 相同。
如果该频道还有其他引用,您仍然可以访问它。如果没有,它将被垃圾收集。
此外,nil
与关闭的通道在写入或读取时的行为不同。来自 Dave Cheney 的博客 post、Channel Axioms,我建议完整阅读:
- A send to a nil channel blocks forever
- A receive from a nil channel blocks forever
- A send to a closed channel panics
- A receive from a closed channel returns the zero value immediately
它在语言规范中。
您可以永远从关闭的通道接收,但在关闭的通道上写入会导致运行时恐慌。
两个在 nil 通道上的操作都会永远阻塞。
这种行为常用于同步方案。
另一个关键区别是select
:
- 一个
closed
通道,会立即selected,得到通道类型的nil值。
因此可能会导致 select 中的其他频道永远不会 selected.
- 一个
nil
频道,永远不会被 select 编辑。
我正在使用 Go 频道,我想知道关闭频道和将其设置为 nil 之间有什么区别?
编辑:
在这个example中,我想断开发送者和接收者的连接,无论是关闭通道还是设置为nil。执行此操作的最佳做法是什么?
将通道变量设置为 nil 只是将变量设置为 nil,同时保留之前初始化的通道。
这与将任何其他变量设置为 nil 相同。
如果该频道还有其他引用,您仍然可以访问它。如果没有,它将被垃圾收集。
此外,nil
与关闭的通道在写入或读取时的行为不同。来自 Dave Cheney 的博客 post、Channel Axioms,我建议完整阅读:
- A send to a nil channel blocks forever
- A receive from a nil channel blocks forever
- A send to a closed channel panics
- A receive from a closed channel returns the zero value immediately
它在语言规范中。 您可以永远从关闭的通道接收,但在关闭的通道上写入会导致运行时恐慌。 两个在 nil 通道上的操作都会永远阻塞。 这种行为常用于同步方案。
另一个关键区别是select
:
- 一个
closed
通道,会立即selected,得到通道类型的nil值。
因此可能会导致 select 中的其他频道永远不会 selected. - 一个
nil
频道,永远不会被 select 编辑。