提问人:Alexis Wilke 提问时间:7/13/2023 更新时间:7/13/2023 访问量:118
Golang 会正确优化范围循环并避免复制每个对象吗?
Will Golang properly optimize a for range loop and avoid copying each object?
问:
在我正在编写的一些 Go 代码中,我经常看到这样的循环:
var slice []SomeType
...fill slice...
for idx, obj := range slice {
obj.SetSomeValue(123)
slice[idx] = obj
}
obj
将是中找到的对象的副本(尽管不是指针,因为它使用浅副本)。slice
我想知道的是:现有的 Go 编译器是否能够通过将 直接应用于 at 的对象来优化循环,还是像上面的代码所暗示的那样制作两个副本?SetSomeValue()
slice[idx]
我的简单解决方案是改用指针,因此切片变为:
var slice []*SomeType
则 loop 变量是指向对象的指针,因此它在这里只复制一个指针,并且调用直接应用于 中的对象。obj
SetSomeValue()
slice
另一种解决方案是按如下方式对切片进行调用:
for idx, _ := range slice {
slice[idx].SetSomeValue(123)
}
但是,在这种情况下,重复和编译时也可能最终重复多次(尽管我仍然认为这比第一种方法更好)。slice[idx].
答: 暂无答案
评论
obj := &slice[idx]
for a, b:=range slice { slice[a].x=1; y:=b.x }
y