我去,我假设切片是通过引用传递的,但这似乎适用于值,但不适用于数组本身。例如,如果我有这个结构:
l := Line{
Points: []Point{
Point{3, 4},
},
}
我可以定义一个变量,它传递对结构切片的引用
slice := l.Points
然后,如果我修改它,变量引用的原始结构将反映这些修改。
slice[0].X = 1000
fmt.Printf(
"This value %d is the same as this %d",
slice[0].X,
l.Points[0].X,
)
这与数组的行为不同,我认为数组是按值传递的。因此,例如,如果我使用数组定义了前面的代码:
l := Line{
Points: [1]Point{
Point{3, 4},
},
}
arr := l.Points
arr[0].X = 1000
fmt.Println(arr.[0].X != s.Points[0].X) // equals true, original struct is untouched
那么,该l结构就不会被修改。
现在,如果我想修改切片本身,我显然不能这样做:
slice = append(slice, Point{99, 100})
因为这只会重新定义切片变量,从而丢失原始引用。我知道我可以简单地这样做:
l.Points = append(l.Points, Point{99, 100})
但是,在某些情况下,使用另一个变量比键入整个变量更方便。
我试过这个:
*slice = append(*slice, Point{99, 100})
但它不起作用,因为我试图取消引用显然不是指针的东西。
我终于尝试了这个:
slice := &l.Points
*slice = append(l.Points, Point{99, 100})
它有效,但我不确定发生了什么。为什么切片的值没有被覆盖?这里如何append运作?
绝地无双
收到一只叮咚
梵蒂冈之花
ibeautiful
相关分类