Go 通道上的范围循环和循环变量的垃圾收集

Range loop on a Go channel and garbage collection of the loop variable

考虑以下 Go 代码:

type LargeStructWithNestings struct {...}
func generatorChnl() <-chan *LargeStructWithNestings { ... }

// code snippet
chnl := generatorChnl()
for entry := range chnl {    // line A
    doStuffWith(entry)
    entry = nil              // line B
}

假设通道不经常产生值,并且这些是指向大型结构的指针,上面的 line B 是否会导致 entry 指向的内存的垃圾回收比其他方式更早发生做?或者,一旦循环回转至 line Aentry 指向的内存中的先前位置是否会在下一次迭代在 line A 阻塞时立即符合垃圾回收条件?

objective 是想办法尽可能地减少常驻集的大小。

for 语句不会在迭代之间清除循环变量。有一个在每次迭代中重复使用的循环变量。因此,在从通道接收到新值之前,它将保留最后分配给它的值。

所以是的,如果从 chnl 接收块“长时间”,循环变量 entry 将保持对最后接收(和分配)项目的“引用”,从而防止它来自收集垃圾。

在实践中,这很少(如果有的话)成为问题。来自 channel 的值可能被“频繁”接收,接收到的值可能“很小”,也可能有其他参考,以及这些的任意组合。

如果在您的特定情况下这确实是一个问题,您可以清除该变量,但我从未遇到任何需要它的示例。