Метод 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 шт):

Автор решения: prospero78su

Срез в го изменяемая структура, которая передаётся по ссылке. Поэтому, когда вы создаёте второй срез на основе первого -- вы фактически создаёте срез на основе тех же элементов (такая неочевидная оптимизация).

Более того, если в результате append превышена ёмкость среза -- вы получаете другой срез. Наполнение такое же, но физически другой. Мелочи, про которые надо помнить.

→ Ссылка