JuniorКодЧастоЕщё не отвечали
Что будет при чтении, а затем записи nil-map?
Из nil-map сначала читают, затем в неё пишут. Опишите точный эффект каждой строки — проходит ли она (и какое значение даёт) или паникует (и с каким сообщением).
var m map[string]int
fmt.Println(m["x"]) // чтение
m["x"] = 1 // запись
Определите вывод.
Чтение m["x"] допустимо и возвращает нулевое значение 0 — чтение nil-map никогда не паникует. Запись m["x"] = 1 паникует с assignment to entry in nil map. Перед записью map нужно инициализировать через make(map[string]int) или литерал.
- ✗Думать, что чтение
nil-map паникует — паникует только запись - ✗Ожидать, что запись лениво выделит map, как
appendраститnil-срез - ✗Забывать, что map, объявленная как
var m map[K]V, этоnil, а не пустая map
- →Почему в
nil-срез можно делатьappend, а вnil-map писать нельзя? - →Что возвращает
len(m)дляnil-map и паникует ли проходrangeпо ней?
Оглавление
Что выведет/сделает код?
var m map[string]int
fmt.Println(m["x"]) // чтение
m["x"] = 1 // запись
Результат
0
panic: assignment to entry in nil map
Почему
var m map[string]int объявляет nil-map — заголовок без backing-хеш-таблицы.
- Чтение из
nil-map разрешено: оно не разыменовывает таблицу, а сразу возвращает нулевое значение типа (0дляint). Это удобно для проверок «есть ли ключ» через comma-ok:v, ok := m["x"]даёт0, false. - Запись требует места в таблице, которого нет, поэтому runtime паникует:
assignment to entry in nil map.
Исправление — инициализировать map перед записью:
m := make(map[string]int) // или map[string]int{}
m["x"] = 1 // ок
⚠️ В отличие от nil-среза, в который append умеет выделять backing array, nil-map при записи не инициализируется автоматически.
Оглавление