封闭通道与零通道
Posted
技术标签:
【中文标题】封闭通道与零通道【英文标题】:Closed channel vs nil channel 【发布时间】:2017-09-22 19:23:41 【问题描述】:我正在使用 Go 频道,我想知道关闭频道和将其设置为 nil 有什么区别?
编辑:
在这个example 中,我想通过关闭通道或设置为零来断开发送者和接收者的连接。这样做的最佳做法是什么?
【问题讨论】:
通道值与任何其他值一样。如果没有对它的引用,它将被垃圾收集。相关/有用了解:How does a non initialized channel behave? 【参考方案1】:将通道变量设置为 nil 只是将变量设置为 nil,同时保持之前初始化的通道。
这与将任何其他变量设置为 nil 相同。
如果有其他对该频道的引用,您仍然可以访问它。如果没有,它将被垃圾收集。
此外,nil
与封闭通道在写入或读取时的行为不同。来自 Dave Cheney 的博文Channel Axioms,我建议您完整阅读:
发送到 nil 通道会永远阻塞 来自 nil 通道的接收永远阻塞 发送到关闭的通道发生恐慌 来自关闭通道的接收立即返回零值
【讨论】:
所以,我知道一个好的做法(也许是最好的)是关闭频道。这样,即使有其他对该通道的引用,我也无法使用它,并且可以避免内存泄漏。 (这正是我问这个问题的原因)。感谢您的回复! 谢谢大家!那真的很有帮助。 @Flimzy,确实这篇博文很有用。【参考方案2】:它在语言规范中。 您可以永远从关闭的通道接收,但在关闭的通道上写入会导致运行时恐慌。 在 nil 通道上的两个操作都会永远阻塞。 这种行为常用于同步方案中。
【讨论】:
以上是关于封闭通道与零通道的主要内容,如果未能解决你的问题,请参考以下文章