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

Чем nil-срез отличается от пустого и почему запись в nil-map вызывает panic?

JuniorСрезы, мапы и строки
Коротко

nil-срез (var s []int) и пустой ([]int{}) оба имеют len 0, с обоими работают range и append. Различие — только s == nil и JSON: nil кодируется как null, пустой — как []. nil-map можно читать (нулевое значение), но запись — panic: у неё нет хеш-таблицы, куда писать.

  • Возвращать из функций обычно nil-срез — это идиоматично
  • Для API, где важно [] вместо null, — инициализировать явно
  • map создают make(map[K]V) или литералом

А ещё len(nilMap) == 0, range по ней — ноль итераций

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

Подробно

var a []int          // nil
b := []int{}         // не nil, len 0
a = append(a, 1)     // работает

var m map[string]int
_ = m["x"]           // 0, без паники
m["x"] = 1           // panic: assignment to entry in nil map

Почему append работает с nil, а запись в map — нет. append возвращает новый срез и сам выделяет массив. Запись в мапу изменяет существующую структуру по указателю, а у nil-мапы её нет, и вернуть новую мапу оператор присваивания не может.

Поля структур. Структура с полем-мапой после var cfg Config имеет nil-мапу — конструктор или ленивая инициализация перед записью.

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

  • Сходство и различия nil и пустого среза.
  • Почему nil-map паникует при записи.

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

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

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

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

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