Слайс — заголовок из трёх слов
Из базы пришёл список файлов импорта. Миша передал его в хелпер, который причёсывал имена, — и поправил имя в одном месте, а оно изменилось в исходном списке.
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
слайс — это заголовок из трёх слов: указатель на массив, длина и ёмкость; копируется только заголовок, поэтому данные у слайсов общие.
Что такое слайс
// упрощённо, как слайс устроен внутри:
type slice struct {
ptr unsafe.Pointer // указатель на подлежащий массив
len int // сколько элементов видно
cap int // сколько места есть, начиная с ptr
}
len — количество элементов слайса, cap — ёмкость подлежащего массива. Присваивание и передача в функцию копируют только эти три слова, а не данные.
Данные общие
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
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[:] - почему слайс нельзя сравнивать через
==
Проверьте себя
При импорте каталога «Полка» резервирует буферы под списки файлов. Чему равны len и cap у b := make([]int, 2, 5)?
var a []int — это nil-слайс. Что можно с ним делать?
Чем nil-слайс отличается от пустого []int{} при сериализации?
правильных ответов
Слайс — заголовок: ptr/len/cap. Копируется заголовок, данные общие. nil-слайс отличается от пустого, но ведёт себя так же.
10 000 ₽ · 60 минут · онлайн