2011-12-21 77 views
78

如果我從不檢查其狀態,是否可以永遠打開Go頻道(從不關閉頻道)?會導致內存泄漏嗎?下面的代碼是否正常?可以打開頻道嗎?

func (requestCh chan<- Request) GetResponse(data RequestData) Response { 
    reply := make(chan Response) 
    requestCh <- Request{data: data, replyCh: reply} 
    return <-reply 
} 

回答

106

將Go頻道永遠打開並永不關閉是可以的。當頻道不再使用時,它將被垃圾收集。

請注意,如果接收器是 正在尋找收盤,則只需要關閉通道。關閉通道是 通道上的控制信號,表示不再有數據。

Design Question: Channel Closing

+0

我不確定我是否同意鏈接的迴應。我在2GB範圍內有內存泄漏。一旦我添加了關閉,噴泉就成了滴水。 – Richard 2013-04-01 20:07:50

+0

@理查德:仔細閱讀整篇文章。 Go'gc'的作者和'gccgo'的作者說''close's不是必須的,除非你正在尋找'close'。這是權威性的建議。 – peterSO 2013-04-02 06:05:30

+1

@peterSO,可能是,但我知道我看到了什麼,這就是我所報道的,所以請不要解僱我。 – Richard 2013-04-02 18:05:23

-1

Go是垃圾收集,所以你不必「自由」任何東西。

有關閉頻道的可能性,但主要用作 - close(頻道) - 告訴goroutine(或主程序)在該頻道上不會發送任何內容。

+6

AFAIK程序員仍然負責釋放非託管資源,例如關閉文件,套接字等等。我是否需要像文件一樣關閉頻道? – Kluyg 2011-12-21 17:32:18

+0

@Kluyg答案是否定的。你在談論OS資源(哪些頻道不是)。它取決於資源和語言,但通常建議手動關閉操作系統資源,而不是因爲GC不這樣做,而是因爲它不確定。最常見的相關_gotcha_是許多打開文件_錯誤。你繼續打開文件...你希望GC這樣做......你沒有用完內存(因此GC沒有啓動)......你在操作系統級別耗盡了文件描述符。 OS殺死進程:) – Pijusn 2017-04-14 03:34:17

1

是的,這是確定要離開的通道打開,而實際上它是典型的。正在打開的頻道不構成對頻道對象的引用,因此不會阻止它被垃圾收集。

11

是的,可以保持通道暢通。由於the go programming language書陳述:

當你完成它,你不需要關閉每個頻道。 它只有在需要關閉一個頻道時才需要告知 接收goroutine所有數據都已發送。無論垃圾收集器是否關閉,垃圾回收器確定爲無法訪問的通道將回收其資源 。即使在垃圾回收的語言(不要與打開的文件關閉操作混淆 。調用 關閉方法上的每個文件是很重要的,當你完成它。)

相關問題