是否可以打开频道?

时间:2011-12-21 17:12:39

标签: go channel

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

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

6 个答案:

答案 0 :(得分:175)

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

  

请注意,只有接收器才能关闭通道   寻找一个接近。关闭通道是控制信号   通道表示不再有数据。

     

Design Question: Channel Closing

答案 1 :(得分:22)

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

  

完成后,您无需关闭每个频道。的这是   只有当需要告诉时才需要关闭频道   接收已发送所有数据的goroutines。   垃圾收集器确定无法到达将有其   资源是否已关闭。 (不要混淆这个   使用打开文件的关闭操作。打电话是很重要的   完成后,关闭每个文件的方法。)

答案 2 :(得分:5)

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

答案 3 :(得分:3)

使用Go频道的一个一般原则是,不要从接收方关闭频道,如果该频道有多个并发发件人,则不要关闭频道。

正如上面答案中明确提到的那样,每个通道一旦标记为要清理,最终都会被GC,所以可以不关闭通道,唯一的不同是,该通道将可用于{{1 }}经过几个周期后,即使未明确关闭。

以下thisthis文章还展示了在1:N,N:1或M:N(发送者:接收者)的情况下关闭频道的各种方法

答案 4 :(得分:0)

上面已经很好地介绍了这一点,但是我发现 A Tour of Go 中的以下内容非常清楚,其中还给出了何时 "stylePreprocessorOptions": { "includePaths": [ "src/assets" ] }, 的示例:

<块引用>

另一个注意事项:频道不像文件;您通常不需要关闭它们。仅当必须告知接收者没有更多值时才需要关闭,例如终止 close 循环。

答案 5 :(得分:-3)

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

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