Map: создание, чтение, запись, удаление и проверка ключа
Содержание курса
Чтение, запись, идиома value-ok и delete
Запись и обновление — один синтаксис:
m := make(map[string]int)
m["hits"] = 1 // новая пара
m["hits"] = 2 // перезапись; теперь m["hits"] == 2
Чтение по ключу:
v := m["hits"] // v == 2
v = m["miss"] // ключа нет — v == 0
Вот где возникает проблема. Допустим, вы храните количество ошибок и ещё не фиксировали ни одной. m["errors"] вернёт 0 — но это нулевое значение типа, а не подтверждение, что ключ вообще существует. Отличить одно от другого помогает двухзначная форма:
v, ok := m["errors"]
if ok {
fmt.Println("ключ есть, значение:", v)
} else {
fmt.Println("ключа нет")
}
Если ключ присутствует, ok == true и v — реальное значение. Если ключа нет, ok == false и v == 0. Когда важно только наличие ключа, переменную значения отбрасывают: _, ok := m[key].
Ситуация, где это критично: ключ "errors" был явно добавлен со значением 0 (например, как сброс счётчика). Однозначная форма v := m["errors"] даст 0 в обоих случаях — и когда ключа нет, и когда он есть с нулём. Только v, ok позволяет их различить.
Удаление ключа:
delete(m, "hits")
delete — встроенная функция, не метод. Если ключа в map нет, вызов просто ничего не делает — паники не будет. После удаления v, ok := m["hits"] вернёт ok == false.
