Инициализация не указана.
Что произойдёт при объявлении слайса без инициализации?
Инициализация не указана.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Что произойдёт при объявлении слайса без инициализации?
- В Go слайс представляет собой ссылку на массив
- при отсутствии инициализации получается nil-слайс
- для nil-слайса значения len и cap равны 0
- append работает и при необходимости создаёт новый массив
- nil безопасен для чтения, но обращение по индексу недопустимо
- проверка слайса: слайс == nil → true
- на практике пустой и nil-слайс часто ведут себя одинаково, хотя их внутреннее состояние различается
Итог: объявление слайса без инициализации создаёт nil-слайс с нулевыми длиной и ёмкостью. Его можно безопасно передавать в append и проверять на nil.
Развёрнутый ответ
Краткий ответ
В Go объявление слайса без начальной инициализации, например var s []int, приводит к тому, что переменная s содержит nil-слайс. Иными словами, переменная объявлена корректно, однако underlying массив отсутствует, а длина равна нулю; указатель во внутренней структуре имеет значение nil.
Основные особенности
- Nil-слайс — это допустимый слайс, для которого
len(s) == 0,cap(s) == 0, а сам слайс имеет значениеnil. Выражениеs == nilвернётtrue. - Чтение элемента по индексу приведёт к runtime panic, поскольку индекс выходит за допустимый диапазон. При этом добавление элементов с помощью
appendвыполняется штатно: слайс при необходимости будет автоматически инициализирован. - Пустой слайс, созданный литералом
[]int{}, отличается от nil-слайса тем, что nil-состояние явно указывает на отсутствие данных. Такое различие может использоваться для оптимизации и проверки факта инициализации.
Практическое применение
В прикладном коде функция нередко возвращает nil-слайс, если данных нет: это позволяет избежать ненужных аллокаций. Однако при реализации обработки следует учитывать отличие nil-слайса от пустого, особенно во время сериализации и сравнений. Например, при JSON-маршалинге nil-слайс преобразуется в null, тогда как пустой слайс — в []. Это важно для предсказуемого поведения API.