Через второй возвращаемый параметр при обращении к мапе — так называемый comma-ok. Обычное чтение
v := m[key] всегда вернёт значение: если ключа нет, это будет нулевое значение типа (0 для чисел, "" для строк, nil для указателей). А значит, по одному только
v нельзя понять, лежал ли там реальный ноль или ключа просто не было:m := map[string]int{"a": 0}
v := m["a"] // 0 — но ключ есть
v = m["b"] // 0 — а ключа нетФорма с двумя переменными решает это: второе значение — булев флаг, который равен
true, только если ключ действительно присутствует в мапе. Именно на него и нужно смотреть, а не на само значение:v, ok := m["a"]
if ok {
// ключ есть, v — реальное значение (даже если это 0)
}
_, ok = m["b"] // ok == false, ключа нет
Отсюда типичный идиоматичный паттерн — проверка и использование в одном
if:if v, ok := m[key]; ok {
// работаем с v
}🐸 Библиотека Go для собеса