2017-04-25 113 views
4

我正在使用Go频道,我在想关闭频道并将其设置为零有什么区别?关闭频道vs零频道

编辑:

在这种example,我想通过断开发送机和接收机,是否关闭了该通道或设置到等于零。最佳做法是什么?

+0

通道值与任何其他值一样。如果没有引用它,它将被垃圾收集。相关/有用的知道:[非初始化通道如何表现?](http://stackoverflow.com/questions/39015602/how-does-a-non-initialized-channel-behave/39016004#39016004) – icza

回答

6

将通道变量设置为零只是简单地将变量设置为零,而保留之前引用的通道已初始化。

与将其他变量设置为零相同。

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

此外,nil与封闭通道在写入或读取时行为不同。从戴夫·切尼的博客文章,Channel Axioms,这是我的全部推荐阅读:

  • 一个发送到零通道块永远
  • 一个从零通道块接收永远
  • 一个发送到封闭的通道恐慌
  • 甲从关闭信道接收返回零值立即
+1

因此,我知道一个好的做法(可能是最好的)是关闭频道。这样,即使有其他引用到该频道,我也无法使用它,并且我将避免内存泄漏。 (这正是我问这个问题的原因)。感谢您的回复! – OmarIlias

+0

谢谢大家!这真的很有帮助。 @Flimzy,确实这篇博客文章非常有用。 – OmarIlias

2

它符合语言规范。 您可以永久收到来自封闭渠道的信息,但是在封闭渠道上写信会导致运行时恐慌。 在一个零通道上的操作都会永久阻止。 这种行为通常用于同步方案。