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

请考虑以下 Go 代码:


type LargeStructWithNestings struct {...}

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


// code snippet

chnl := generatorChnl()

for entry := range chnl {    // line A

    doStuffWith(entry)

    entry = nil              // line B

}

假设通道不经常生成值,并且这些是指向大型结构的指针,那么上述是否会导致对 by 所指向的内存的垃圾回收发生得比原本更早发生?或者,一旦循环旋转回 ,一旦下一个迭代块位于 ?line Bentryline Aentryline A


目标是找到一种方法,如果可能的话,保持常驻集大小修剪。


慕码人8056858
浏览 72回答 1
1回答

慕婉清6462132

该语句不会在迭代之间清除循环变量。有一个单循环变量,在每次迭代中都会重复使用。因此,在从通道接收到新值之前,它将保留上次分配给它的值。for所以,是的,如果从块接收“很长时间”,循环变量将保留对最后一个接收(和分配)项目的“引用”,从而防止它被垃圾回收。chnlentry在实践中,这很少是一个问题,如果有的话。来自通道的值可以“频繁”接收,接收的值可能是“小”的,也可能有其他参考,以及这些的任意组合。如果在您的特定情况下,这确实是一个问题,您可以清除该变量,但我从未遇到过任何需要它的示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go