如果我從不檢查其狀態,是否可以永遠打開Go頻道(從不關閉頻道)?會導致內存泄漏嗎?下面的代碼是否正常?可以打開頻道嗎?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
如果我從不檢查其狀態,是否可以永遠打開Go頻道(從不關閉頻道)?會導致內存泄漏嗎?下面的代碼是否正常?可以打開頻道嗎?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
將Go頻道永遠打開並永不關閉是可以的。當頻道不再使用時,它將被垃圾收集。
請注意,如果接收器是 正在尋找收盤,則只需要關閉通道。關閉通道是 通道上的控制信號,表示不再有數據。
Go是垃圾收集,所以你不必「自由」任何東西。
有關閉頻道的可能性,但主要用作 - close(頻道) - 告訴goroutine(或主程序)在該頻道上不會發送任何內容。
是的,這是確定要離開的通道打開,而實際上它是典型的。正在打開的頻道不構成對頻道對象的引用,因此不會阻止它被垃圾收集。
是的,可以保持通道暢通。由於the go programming language書陳述:
當你完成它,你不需要關閉每個頻道。 它只有在需要關閉一個頻道時才需要告知 接收goroutine所有數據都已發送。無論垃圾收集器是否關閉,垃圾回收器確定爲無法訪問的通道將回收其資源 。即使在垃圾回收的語言(不要與打開的文件關閉操作混淆 。調用 關閉方法上的每個文件是很重要的,當你完成它。)
我不確定我是否同意鏈接的迴應。我在2GB範圍內有內存泄漏。一旦我添加了關閉,噴泉就成了滴水。 – Richard 2013-04-01 20:07:50
@理查德:仔細閱讀整篇文章。 Go'gc'的作者和'gccgo'的作者說''close's不是必須的,除非你正在尋找'close'。這是權威性的建議。 – peterSO 2013-04-02 06:05:30
@peterSO,可能是,但我知道我看到了什麼,這就是我所報道的,所以請不要解僱我。 – Richard 2013-04-02 18:05:23