Пойду, я предположил, что срезы были переданы по ссылке, но, похоже, это работает для значений, но не для самого массива. Например, если у меня есть эта структура:
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
?