封闭通道与零通道

时间:2017-04-25 16:40:05

标签: go channel

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

修改

在这个example中,无论关闭频道还是设置为nil,我都希望断开发送方和接收方的连接。这样做的最佳做法是什么?

2 个答案:

答案 0 :(得分:10)

将通道变量设置为nil只需将变量设置为nil,同时保留之前引用的通道初始化。

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

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

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

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

答案 1 :(得分:2)

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