如果我从不检查其状态,是否可以永远打开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