Как устроен срез (slice) в Go?
- Чем len отличается от cap?
- Что происходит при append, когда ёмкость закончилась?
Срез — дескриптор из трёх полей: указатель на базовый массив, длина (len — сколько элементов доступно) и ёмкость (cap — сколько поместится до конца массива). append пишет в тот же массив, пока хватает ёмкости; иначе выделяет новый массив большего размера и копирует данные.
- Рост: примерно ×2 для малых срезов, плавнее (~×1.25) для больших
- Срез среза s[a:b] делит тот же массив
- Известный размер — make([]T, 0, n): без перевыделений
А ещё Результат append обязательно присваивать: s = append(s, x)
Подробно
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.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Срез — копия массива с фиксированной длиной
- ✗Указатель на массив и длина; append всегда выделяет новый массив и копирует данные
- ✓Указатель на массив, len и cap; append растит массив при нехватке
- ✗cap — число используемых элементов
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.