Что произойдет при попытке записи в неинициализированную (nil) map?

Ответ

При попытке записи в неинициализированную (nil) map программа упадет с паникой во время выполнения (runtime panic).

Сообщение об ошибке будет выглядеть так: panic: assignment to entry in nil map.

Почему это происходит?

Нулевое значение для типа map — это nil. nil-мапа не имеет выделенной в памяти базовой структуры данных (хэш-таблицы) для хранения элементов. Попытка записи — это обращение к несуществующей структуре, что и вызывает панику.

Пример, вызывающий панику:

// Объявляем переменную типа map, но не инициализируем ее.
// Ее значение по умолчанию — nil.
var m map[string]int

// Эта строка вызовет панику.
m["key"] = 42 // panic: assignment to entry in nil map

Как правильно инициализировать map:

Перед использованием мапу необходимо создать с помощью встроенной функции make() или через литерал.

// Способ 1: с помощью make
m1 := make(map[string]int)
m1["key"] = 42 // Работает

// Способ 2: с помощью литерала
m2 := map[string]int{}
m2["key"] = 42 // Тоже работает

Важное отличие: Чтение из nil-мапы

В отличие от записи, чтение из nil-мапы является безопасной операцией и не вызывает панику. Такая операция всегда возвращает нулевое значение для типа-значения мапы.

var m map[string]int // m is nil

value := m["any_key"] // Не будет паники, value будет равно 0 (нулевое значение для int)

// Проверка наличия ключа также работает корректно
_, ok := m["any_key"] // ok будет false

Ответ 18+ 🔞

Ну вот, опять про эти ваши мапы в Go, блядь. Слушай, история проще пареной репы, но если её проебать — будет пиздец, внатуре.

Представь себе: у тебя есть переменная, типа map. Ты её объявил, но не создал, не makeнул, не инициализировал, короче. Что она такое? Правильно, nil. Абсолютный ноль, пустота, вакуум, нихуя. И вот ты такой красавчик пытаешься в эту пустоту что-то записать: m["key"] = 42. И что получаешь? Получаешь панику на весь runtime, ёпта! Сообщение тебе такое ласковое: panic: assignment to entry in nil map. То есть, «паника: попытка записи в nil-мапу, идиот».

Почему так? Да потому что nil-мапа — это не просто пустая коробка. Это отсутствие коробки вообще, блядь! Туда даже хуй положить некуда, структуры-то хэш-таблицы нет. Вот и летишь вниз головой с ошибкой.

Вот так НЕ НАДО, если не хочешь охуеть от паники:

// Объявил и успокоился. Значение — nil.
var m map[string]int

// Пытаешься запихнуть — получаешь пиздюлину от рантайма.
m["key"] = 42 // panic: assignment to entry in nil map

А вот так НАДО, если хочешь жить спокойно:

Есть два классических способа, оба рабочие, выбирай любой, лишь бы не nil.

// Способ 1: через make, как взрослый.
m1 := make(map[string]int)
m1["key"] = 42 // Всё ок, записалось.

// Способ 2: через литерал, красиво и сразу.
m2 := map[string]int{}
m2["key"] = 42 // Тоже ок, красота.

А вот что реально охуенно и многих вводит в ступор, так это то, что читать-то из nil-мапы можно! Да-да, ты не ослышался. Паники не будет, ёпта. Просто вернётся нулевое значение для типа, который внутри мапы лежит.

Смотри, какой прикол:

var m map[string]int // m — всё ещё nil, нихуя не создано.

value := m["any_key"] // Никакой паники! value будет равно 0 (потому что int).
// И проверка на наличие ключа тоже сработает.
_, ok := m["any_key"] // ok будет false, естественно.

Вот такая, блядь, магия. Запись — пиздец и паника. Чтение — пожалуйста, на здоровье, всегда ноль вернём. Главное — не перепутай, а то опять panic в лоб получишь, и будешь сидеть, чесать репу: «И что я, мудак, сделал?».