Материал проходит вычитку — возможны неточности.
Урок 2 из 118

Слайс — заголовок из трёх слов

Из базы пришёл список файлов импорта. Миша передал его в хелпер, который причёсывал имена, — и поправил имя в одном месте, а оно изменилось в исходном списке.

Go
Главная мысль

слайс — это заголовок из трёх слов: указатель на массив, длина и ёмкость; копируется только заголовок, поэтому данные у слайсов общие.

Что такое слайс

// упрощённо, как слайс устроен внутри:
type slice struct {
    ptr  unsafe.Pointer // указатель на подлежащий массив
    len  int            // сколько элементов видно
    cap  int            // сколько места есть, начиная с ptr
}

len — количество элементов слайса, cap — ёмкость подлежащего массива. Присваивание и передача в функцию копируют только эти три слова, а не данные.

Данные общие

Go

alias и ids — два заголовка на один массив. Изменение через alias видно через ids. Это отличает слайс от массива, который при присваивании копируется целиком.

Nil и пустой слайс

У слайса два «пустых» состояния:

var a []int         // nil: len 0, cap 0, ptr nil
b := []int{}        // пустой, но не nil
c := make([]int, 0) // тоже не nil

Все три имеют длину ноль и одинаково работают с append и len. Разница — в проверке a == nil и в сериализации: json.Marshal даст null для nil-слайса и [] для пустого. append к nil-слайсу — легальный способ строить слайс с нуля.

В следующем уроке

Вы узнаете:

  • как создать слайс: make, литерал и arr[:]
  • почему слайс нельзя сравнивать через ==
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

При импорте каталога «Полка» резервирует буферы под списки файлов. Чему равны len и cap у b := make([]int, 2, 5)?

Вопрос 2 из 3

var a []int — это nil-слайс. Что можно с ним делать?

Вопрос 3 из 3

Чем nil-слайс отличается от пустого []int{} при сериализации?

Итоги

Слайс — заголовок: ptr/len/cap. Копируется заголовок, данные общие. nil-слайс отличается от пустого, но ведёт себя так же.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки