🟡 Средний · 2 очк. Map
Что произойдёт при записи в nil map?
A Запишется значение
B panic
C Ошибка компиляции
D Ничего
Объяснение вопроса

В Go nil map ведет себя асимметрично: чтение безопасно, а запись вызывает panic.

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

// Чтение из nil map - безопасно, вернет zero value:
fmt.Println(m["key"])    // 0
fmt.Println(len(m))      // 0
_, ok := m["key"]        // ok == false

// Запись в nil map - panic!
m["key"] = 42            // panic: assignment to entry in nil map

Почему так устроено

Map в Go - это указатель на хеш-таблицу. Когда map равна nil, структура данных не создана. Чтение возвращает zero value (как для отсутствующего ключа), а запись не может выделить память - отсюда panic.

Правильная инициализация

// Способ 1: make
m := make(map[string]int)

// Способ 2: литерал
m := map[string]int{}

// Способ 3: литерал с данными
m := map[string]int{"a": 1, "b": 2}

// С подсказкой начальной емкости (не ограничивает размер):
m := make(map[string]int, 100)

Типичная ошибка в структурах

Частая ловушка - забыть инициализировать map внутри структуры:

type Cache struct {
    data map[string]string
}

c := Cache{}       // c.data == nil
c.data["x"] = "y"  // panic!

// Правильно:
c := Cache{data: make(map[string]string)}

Проверка на nil

if m == nil {
    m = make(map[string]int)
}
m["key"] = 42 // теперь безопасно

Операции, безопасные с nil map: чтение значения, len(), delete(), итерация for range (0 итераций). Единственная опасная операция - запись.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.