Метод append в Golang
недавно начал изучать Golang и столкнулся с недопониманием работы метода append. Например, есть слайс, из которого нужно убрать третий элемент и результат присвоить второму слайсу. Не понимаю, почему, если я присваиваю результат второму слайсу, то первый слайс тоже меняется и в нем появляется еще одна пятерка.
package main
import "fmt"
func main() {
firstSlice := []int{1, 2, 3, 4, 5}
i := 2
secondSlice := append(firstSlice[:i], firstSlice[i+1:]...)
fmt.Println(firstSlice) //[1 2 4 5 5]
fmt.Println(secondSlice) //[1 2 4 5]
}
https://go.dev/play/p/9nC99QfYomb
Ответы (1 шт):
Срез в го изменяемая структура, которая передаётся по ссылке. Поэтому, когда вы создаёте второй срез на основе первого -- вы фактически создаёте срез на основе тех же элементов (такая неочевидная оптимизация).
Более того, если в результате append превышена ёмкость среза -- вы получаете другой срез. Наполнение такое же, но физически другой. Мелочи, про которые надо помнить.