【问题标题】:Closed channel vs nil channel封闭通道与零通道
【发布时间】:2017-09-22 19:23:41
【问题描述】:

我正在使用 Go 频道,我想知道关闭频道和将其设置为 nil 有什么区别?

编辑:

在这个example 中,我想通过关闭通道或设置为零来断开发送者和接收者的连接。这样做的最佳做法是什么?

【问题讨论】:

标签: go channel


【解决方案1】:

将通道变量设置为 nil 只是将变量设置为 nil,同时保持之前初始化的通道。

这与将任何其他变量设置为 nil 相同。

如果有其他对该频道的引用,您仍然可以访问它。如果没有,它将被垃圾收集。

此外,nil 与封闭通道在写入或读取时的行为不同。来自 Dave Cheney 的博文Channel Axioms,我建议您完整阅读:

  • 发送到 nil 通道会永远阻塞
  • 来自 nil 通道的接收永远阻塞
  • 发送到关闭的通道发生恐慌
  • 来自关闭通道的接收立即返回零值

【讨论】:

  • 所以,我知道一个好的做法(也许是最好的)是关闭频道。这样,即使有其他对该通道的引用,我也无法使用它,并且可以避免内存泄漏。 (这正是我问这个问题的原因)。感谢您的回复!
  • 谢谢大家!那真的很有帮助。 @Flimzy,确实这篇博文很有用。
【解决方案2】:

它在语言规范中。 您可以永远从关闭的通道接收,但在关闭的通道上写入会导致运行时恐慌。 在 nil 通道上的两个操作都会永远阻塞。 这种行为常用于同步方案中。

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2017-07-02
    • 2022-01-10
    • 2018-05-09
    • 2023-03-06
    相关资源
    最近更新 更多