请考虑以下 Go 代码:type LargeStructWithNestings struct {...}func generatorChnl() <-chan *LargeStructWithNestings { ... }// code snippetchnl := generatorChnl()for entry := range chnl { // line A doStuffWith(entry) entry = nil // line B}假设通道不经常生成值,并且这些是指向大型结构的指针,那么上述是否会导致对 by 所指向的内存的垃圾回收发生得比原本更早发生?或者,一旦循环旋转回 ,一旦下一个迭代块位于 ?line Bentryline Aentryline A目标是找到一种方法,如果可能的话,保持常驻集大小修剪。
1 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
该语句不会在迭代之间清除循环变量。有一个单循环变量,在每次迭代中都会重复使用。因此,在从通道接收到新值之前,它将保留上次分配给它的值。for
所以,是的,如果从块接收“很长时间”,循环变量将保留对最后一个接收(和分配)项目的“引用”,从而防止它被垃圾回收。chnl
entry
在实践中,这很少是一个问题,如果有的话。来自通道的值可以“频繁”接收,接收的值可能是“小”的,也可能有其他参考,以及这些的任意组合。
如果在您的特定情况下,这确实是一个问题,您可以清除该变量,但我从未遇到过任何需要它的示例。
- 1 回答
- 0 关注
- 71 浏览
添加回答
举报
0/150
提交
取消