如果我从来没有检查它的状态,它是否可以让一个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通道的一个一般原则是,不要从接收端关闭通道,如果通道有多个并发发送方,也不要关闭通道。”
正如上面的回答中明确提到的,每个通道最终都会被GCed,一旦它被标记为清理,所以它可以让通道未关闭,唯一的区别是,该通道将在几个周期后可用,可能没有显式关闭。
下面的文章this和this还展示了在1:N、N:1或M:N(发送方:接收方)的情况下关闭信道的各种方法。
其他回答
如果你手动关闭通道,你就节省了一些垃圾收集器的任务,从而节省了一些计算,并加快了你的程序。
Go是垃圾收集,所以你真的不需要“释放”任何东西。
也有可能关闭通道,但它主要用于- close(通道)-告诉goroutine(或主程序)该通道上不会发送任何其他内容。
这并不总是好的。打开通道可能会导致内存泄漏,这取决于对通道的编码方式。
尽管GO是垃圾收集,但如果由于某种原因使用通道的Goroutine被阻塞(而保持通道打开可能是Goroutine保持阻塞的原因之一),则会出现内存泄漏。
这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。
https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee
让Go频道永远打开而不关闭是可以的。当通道不再使用时,它将被垃圾收集。
请注意,只有在接收方处于关闭状态时才有必要关闭通道 寻找一个结束。关闭通道是一个控制信号上 通道,表示后面没有更多数据。 设计问题:通道关闭
是的,保持频道开放是可以的,事实上这是典型的。打开的通道不构成对通道对象的引用,因此不会阻止它被垃圾收集。