如果我从来没有检查它的状态,它是否可以让一个Go通道永远打开(从不关闭通道)?它会导致内存泄漏吗?下面的代码可以吗?
func (requestCh chan<- Request) GetResponse(data RequestData) Response { reply := make(chan Response) requestCh <- Request{data: data, replyCh: reply} return <-reply }
Go是垃圾收集,所以你真的不需要“释放”任何东西。
也有可能关闭通道,但它主要用于- close(通道)-告诉goroutine(或主程序)该通道上不会发送任何其他内容。
让Go频道永远打开而不关闭是可以的。当通道不再使用时,它将被垃圾收集。
请注意,只有在接收方处于关闭状态时才有必要关闭通道 寻找一个结束。关闭通道是一个控制信号上 通道,表示后面没有更多数据。< / p > 设计问题:通道关闭
请注意,只有在接收方处于关闭状态时才有必要关闭通道 寻找一个结束。关闭通道是一个控制信号上 通道,表示后面没有更多数据。< / p >
设计问题:通道关闭
是的,保持频道开放是可以的,事实上这是典型的。打开的通道不构成对通道对象的引用,因此不会阻止它被垃圾收集。
是的,保持频道畅通是可以的。正如 go编程语言书所述:
当你用完每个频道时,你不需要关闭每个频道。< >强劲的 只有在需要关闭一个通道时才告诉重要的 接收已发送所有数据的gorout例程。一个通道 不可达的垃圾收集器将有它的 无论是否关闭,都将回收资源。(不要混淆 用close操作打开文件。调用是很重要的 关闭方法在每个文件,当你完成它。)
“使用Go通道的一个一般原则是不要从接收端关闭通道,如果通道有多个并发发送方,也不要关闭通道。”
正如上面的回答中明确提到的,每个通道一旦被标记为清理,最终都会被GCed,所以保持通道未关闭是可以的,唯一的区别是,该通道将在几个周期后可用gc,如果没有显式关闭的话。
gc
同样,下面的文章这和这展示了在1:N, N:1或M:N的情况下关闭通道的各种方法(发送方:接收方)
上面已经很好地介绍了这一点,但是我发现围棋之旅中的以下内容非常清楚,它也给出了一个何时close的示例:
close
另注:通道不像文件;你通常不需要关闭它们。只有当接收方必须被告知没有更多值时才需要关闭,例如终止range循环。
range
如果你手动关闭通道,你就节省了一些垃圾收集器的任务,从而节省了一些计算,并加快了你的程序。