Что возвращает мапа в Go по отсутствующему ключу
Что проверяют
Понимаете ли вы концепцию нулевого значения в Go и знаете ли форму с ok. Дальше обычно спрашивают про nil-мапу и про конкурентный доступ, так что это вход в разговор о мапах вообще.
Как отвечать
Обращение по отсутствующему ключу не паникует и не возвращает ошибку. Мапа отдаёт нулевое значение для типа значений: 0 для чисел, пустую строку, false, nil для указателей, слайсов, мап и интерфейсов, а для структуры значение со всеми полями нулевыми.
m := map[string]int{"a": 1}
v := m["b"] // 0
v, ok := m["b"] // 0, false
delete(m, "b") // не паникуетФорма с ok это единственный способ отличить «ключа нет» от «ключ есть, но значение нулевое». Для счётчиков разница неважна, и m[k]++ прекрасно работает на пустой мапе. А для map[string]bool или для кэша на map[string]*User она принципиальна: без ok вы не отличите отсутствие записи от записанного false.
Отдельно про nil-мапу: читать из неё законно, она ведёт себя как пустая и возвращает нулевое значение с ok равным false. А вот запись паникует с assignment to entry in nil map, поэтому мапу внутри структуры нужно создавать через make в конструкторе.
Где спотыкаются
Проверяют наличие сравнением с нулём: if m[k] != 0 или if m[k] != "". Для мапы, где нулевое значение осмысленно, это тихая логическая ошибка, которая всплывает на редких данных.
Второе: забывают инициализировать мапу. Поле структуры или переменная через var дают nil-мапу, чтение проходит, первый же m[k] = v роняет сервис в рантайме.
Третье: пробуют менять поле структуры прямо в мапе. m[k].Field = v для map[string]Struct не компилируется, потому что элемент мапы не адресуем. Либо хранить указатели, либо доставать значение, менять и класть обратно.