如果我从不检查其状态,是否可以永久打开Go通道(从不关闭通道)?它会导致内存泄漏吗?以下代码是否正常?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
答案 0 :(得分:175)
将Go频道永久打开并永不关闭它是可以的。当不再使用该频道时,它将被垃圾收集。
请注意,只有接收器才能关闭通道 寻找一个接近。关闭通道是控制信号 通道表示不再有数据。
答案 1 :(得分:22)
是的,可以保持频道开放。正如the go programming language书所述:
完成后,您无需关闭每个频道。的这是 只有当需要告诉时才需要关闭频道 接收已发送所有数据的goroutines。 垃圾收集器确定无法到达将有其 资源是否已关闭。 (不要混淆这个 使用打开文件的关闭操作。打电话是很重要的 完成后,关闭每个文件的方法。)
答案 2 :(得分:5)
是的,将频道打开是可以的,事实上这是典型的。正在打开的通道不构成对通道对象的引用,因此不会使其不被垃圾回收。
答案 3 :(得分:3)
“ 使用Go频道的一个一般原则是,不要从接收方关闭频道,如果该频道有多个并发发件人,则不要关闭频道。”
正如上面答案中明确提到的那样,每个通道一旦标记为要清理,最终都会被GC,所以可以不关闭通道,唯一的不同是,该通道将可用于{{1 }}经过几个周期后,即使未明确关闭。
答案 4 :(得分:0)
上面已经很好地介绍了这一点,但是我发现 A Tour of Go 中的以下内容非常清楚,其中还给出了何时 "stylePreprocessorOptions": {
"includePaths": [
"src/assets"
]
},
的示例:
另一个注意事项:频道不像文件;您通常不需要关闭它们。仅当必须告知接收者没有更多值时才需要关闭,例如终止 close
循环。
答案 5 :(得分:-3)
Go是垃圾收集,所以你不必“免费”任何东西。
有可能关闭频道,但它主要用作 - 关闭(频道) - 告诉goroutine(或主节目)在该频道上不会发送任何其他内容。