20 Коллекции
Чем slice отличается от array?
Ответ
Массив [3]int — это значение фиксированной длины. Два массива разной длины — разные типы, присваивание копирует все элементы. Slice []int — это заголовок над массивом: указатель на данные, длина и ёмкость. Заголовок копируется дёшево, сами элементы остаются общими.
Подробнее
В примере sl := arr[:] смотрит на тот же массив, поэтому sl[0] = 9 меняет arr. append, которому не хватает ёмкости, выделяет новый массив. После этого запись в grown массив arr уже не трогает.
package main
import "fmt"
func main() {
arr := [3]int{1, 2, 3}
sl := arr[:]
sl[0] = 9
fmt.Println("массив", arr)
fmt.Println("срез", sl)
grown := append(sl, 4)
grown[0] = 7
fmt.Println("после append массив", arr)
fmt.Println("новый срез", grown)
}