封闭通道与零通道

elm*_*mar 7 channel go

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

编辑:

在这个例子中,我想断开发送者和接收者,无论是关闭频道还是设置为nil.这样做的最佳做法是什么?

Fli*_*mzy 11

将通道变量设置为nil只需将变量设置为nil,同时保留先前引用的通道进行初始化.

它与将任何其他变量设置为nil相同.

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

此外,nil与封闭通道相比,在写入或读取时表现不同.来自Dave Cheney的博客文章,Channel Axioms,我建议全文阅读:

  • 发送到零通道永远阻止
  • 来自零通道的接收将永久阻止
  • 发送到封闭频道的恐慌
  • 来自封闭通道的接收立即返回零值

  • 所以,我知道一个好的做法(也许是最好的)是关闭通道。这样,即使有对该通道的其他引用,我也将无法使用它,并且我将避免内存泄漏。(这正是我问这个问题的原因)。感谢您的回复! (2认同)

Eri*_*ang 10

另一个关键区别是select

  • 一个closed通道,将立即被选择,并获得通道类型的 nil 值。
    因此可能会导致选择中的其他通道永远不会被选择。
  • 一个nil频道,永远不会被选择。