为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕码人8056858 2022-08-09 20:29:50
请考虑以下 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

所以,是的,如果从块接收“很长时间”,循环变量将保留对最后一个接收(和分配)项目的“引用”,从而防止它被垃圾回收。chnlentry

在实践中,这很少是一个问题,如果有的话。来自通道的值可以“频繁”接收,接收的值可能是“小”的,也可能有其他参考,以及这些的任意组合。

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


查看完整回答
反对 回复 2022-08-09
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信