微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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
}

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

目标是找到一种方法,在可能的情况下保持常驻集大小被修剪。

解决方法

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

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

在实践中,这很少(如果有的话)成为问题。来自通道的值可能“经常”收到,收到的值可能“小”,也可能有其他引用,以及这些的任意组合。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。