如何解决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 举报,一经查实,本站将立刻删除。