是否可以打开频道?

问题描述 投票:121回答:4

如果我从不检查其状态,是否可以永久打开Go通道(从不关闭通道)?它会导致内存泄漏吗?以下代码可以吗?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}
go channel
4个回答
184
投票

将Go频道永远打开并永不关闭它是可以的。当不再使用该频道时,它将被垃圾收集。

请注意,如果接收器正在寻找关闭,则只需要关闭通道。关闭通道是通道上的控制信号,表示不再有数据。

Design Question: Channel Closing


23
投票

是的,可以保持频道开放。正如the go programming language书所述:

完成后,您无需关闭每个频道。只有在告知接收goroutine所有数据都已发送时,才需要关闭通道。垃圾收集器确定无法访问的通道将回收其资源,无论它是否已关闭。 (不要将此与打开文件的关闭操作混淆。完成后对每个文件调用Close方法很重要。)


5
投票

是的,将通道打开是可以的,事实上这是典型的。正在打开的通道不构成对通道对象的引用,因此不会使其不被垃圾收集。


-3
投票

Go是垃圾收集,所以你不必“免费”任何东西。

有可能关闭频道,但它主要用作 - 关闭(频道) - 告诉goroutine(或主程序)在该频道上不会发送任何其他内容。

© www.soinside.com 2019 - 2024. All rights reserved.