Все вопросы

20 Коллекции

Чем slice отличается от array?

Массив [3]int — это значение фиксированной длины. Два массива разной длины — разные типы, присваивание копирует все элементы. Slice []int — это заголовок над массивом: указатель на данные, длина и ёмкость. Заголовок копируется дёшево, сами элементы остаются общими.

В примере sl := arr[:] смотрит на тот же массив, поэтому sl[0] = 9 меняет arr. append, которому не хватает ёмкости, выделяет новый массив. После этого запись в grown массив arr уже не трогает.

Пример

Go

общий массив и разрыв после append

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)
}