2017-04-25 72 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

它符合語言規範。 您可以永久收到來自封閉渠道的信息,但是在封閉渠道上寫信會導致運行時恐慌。 在一個零通道上的操作都會永久阻止。 這種行爲通常用於同步方案。