В 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)}
if m == nil {
m = make(map[string]int)
}
m["key"] = 42 // теперь безопасно
Операции, безопасные с nil map: чтение значения, len(), delete(), итерация for range (0 итераций). Единственная опасная операция - запись.