如果我从来没有检查它的状态,它是否可以让一个Go通道永远打开(从不关闭通道)?它会导致内存泄漏吗?下面的代码可以吗?

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

当前回答

这并不总是好的。打开通道可能会导致内存泄漏,这取决于对通道的编码方式。

尽管GO是垃圾收集,但如果由于某种原因使用通道的Goroutine被阻塞(而保持通道打开可能是Goroutine保持阻塞的原因之一),则会出现内存泄漏。

这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。

https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee

其他回答

这并不总是好的。打开通道可能会导致内存泄漏,这取决于对通道的编码方式。

尽管GO是垃圾收集,但如果由于某种原因使用通道的Goroutine被阻塞(而保持通道打开可能是Goroutine保持阻塞的原因之一),则会出现内存泄漏。

这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。

https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee

上面已经很好地说明了这一点,但是我发现A Tour of Go中的以下内容非常清楚,它也给出了一个何时关闭的例子:

另一个注意事项:通道不像文件;你通常不需要关闭它们。只有在必须告诉接收方没有更多的值时才需要关闭,例如终止一个范围循环。

Go是垃圾收集,所以你真的不需要“释放”任何东西。

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

如果你手动关闭通道,你就节省了一些垃圾收集器的任务,从而节省了一些计算,并加快了你的程序。

是的,保持频道畅通是可以的。正如go编程语言书所述:

当你用完之后,你不需要关闭每一个通道。这是 只有在需要关闭一个通道时才告诉重要的 接收已发送所有数据的gorout例程。一个通道 不可达的垃圾收集器将有它的 无论是否关闭,都将回收资源。(不要混淆 用close操作打开文件。调用是很重要的 当你完成每个文件时,关闭方法。)