Получить доступ

Как устроен срез (slice) в Go?

JuniorСрезы, мапы и строки
Ещё спрашивают так:
  • Чем len отличается от cap?
  • Что происходит при append, когда ёмкость закончилась?
Коротко

Срез — дескриптор из трёх полей: указатель на базовый массив, длина (len — сколько элементов доступно) и ёмкость (cap — сколько поместится до конца массива). append пишет в тот же массив, пока хватает ёмкости; иначе выделяет новый массив большего размера и копирует данные.

  • Рост: примерно ×2 для малых срезов, плавнее (~×1.25) для больших
  • Срез среза s[a:b] делит тот же массив
  • Известный размер — make([]T, 0, n): без перевыделений

А ещё Результат append обязательно присваивать: s = append(s, x)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Срезы Go: len, cap, append и общий массив

Подробно

s := make([]int, 3, 5)   // len 3, cap 5: [0 0 0 _ _]
s = append(s, 1)         // len 4, тот же массив
s = append(s, 2, 3)      // len 6 > cap 5 — новый массив, копирование

Почему присваивать результат append. Функция возвращает новый дескриптор: длина изменилась всегда, а указатель — если массив перевыделен. Старая переменная остаётся с прежней длиной.

Рост ёмкости. Пока срез маленький (до 256 элементов в Go 1.18+), ёмкость удваивается, дальше растёт плавнее, с округлением до размеров классов аллокатора. Амортизированная стоимость append — O(1), как у ArrayList.

Срез среза s[1:3] — новый дескриптор над тем же массивом: изменения элементов видны в обоих. Полное выражение среза s[1:3:3] ограничивает ёмкость, и следующий append гарантированно создаст новый массив.

Утечка через подсрез. Маленький срез от огромного массива держит весь массив в памяти. Нужно скопировать нужное: copy или slices.Clone.

Что хотят услышать

  • Три поля дескриптора.
  • Поведение append при нехватке ёмкости.
  • Общий массив у подсрезов.

Частые ошибки

  • Не присваивать результат append.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем