封闭通道与零通道

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 通道上的两个操作都会永远阻塞。 这种行为常用于同步方案中。

【讨论】:

以上是关于封闭通道与零通道的主要内容,如果未能解决你的问题,请参考以下文章

4kw机柜无通道封闭CFD模拟分析及优化(下篇)

您是未出现在 Google Play 商店中的此应用的 Beta 版测试人员

05:线程封闭

线程封闭之栈封闭和ThreadLocal

封闭期5年的基金属于什么基金?

开放封闭原则