假设一个Go 1.18程序有一个相当重的 struct,为此复制被认为是昂贵的:
type MyStruct struct {
P string
// a lot of properties
}
现在让我们定义一个函数,将这些元素的切片作为输入参数,其目标是更新每个切片元素的属性:
func myFunc(sl []MyStruct) {
for i := range sl {
p := &sl[i] // <-- HERE
p.P = "bar"
// other properties mutations
}
}
关键是<-- HERE,Golang 编译器是将slice 元素的临时副本复制到循环的范围内,还是就地获取 slice 元素的地址?
这个想法是为了避免复制整个切片元素。
一个工作示例:https://go.dev/play/p/jHOC2DauyrQ ?v=goprev
森栏
相关分类