Вопрос на собеседовании · Go-разработчик
Как устроен слайс? Что произойдёт при append?
Короткий ответ, ключевые тезисы и ошибки, которых стоит избежать на интервью.
Слайс в Go — небольшой дескриптор, который содержит ссылку на backing array, длину и ёмкость. Сам слайс не хранит элементы отдельно: несколько слайсов могут смотреть на один массив и видеть изменения друг друга.
append добавляет элементы в существующий массив, пока хватает capacity. Когда места недостаточно, runtime выделяет новый массив, копирует элементы и возвращает новый дескриптор. Поэтому результат append нужно присваивать, а предположения о совместном массиве после роста становятся ненадёжными.
01 · Структура ответа
Что важно сказать интервьюеру
Раскройте тезисы, которые относятся именно к этому вопросу, и поясните их на собственном примере:
02 · Пример
Как объяснить на практике
Функция получает slice по значению и делает append. Если capacity хватило, изменение элементов может быть видно вызывающему коду; если произошёл рост, функция работает уже с новым массивом. Чтобы вернуть изменившуюся длину, функция должна вернуть новый slice.
Не заучивайте формулировку дословно. Свяжите принцип с задачей из собственного проекта — интервьюер почти наверняка попросит уточнить детали реализации и компромиссы.
03 · Ошибки
Чего избегать в ответе
04 · Углубление
Что могут спросить следом
- Чем nil slice отличается от пустого?
- Как работает copy?
- Почему небольшой subslice может удерживать много памяти?
05 · Проверка фактов
Первоисточники по теме
Ссылки ниже помогают проверить понятия, методы и ограничения по теме. Они не являются доказательством того, что этот вопрос задают на каждом собеседовании.
- Go Blog: Go Slices — Структура slice, длина, ёмкость и append.
Практика ответа
Ответьте вслух, а не про себя
Откроем тренировку сразу на этом вопросе. Выберите грейд, сформулируйте ответ и сравните его с подсказкой.
Mira