Ответ
Для проверки наличия ключа в map
в Go используется специальная форма присваивания, которая возвращает два значения. Эта идиома называется "comma, ok".
package main
import "fmt"
func main() {
m := map[string]int{
"apple": 1,
"orange": 2,
}
// Пытаемся получить значение по ключу "apple"
val, ok := m["apple"]
if ok {
fmt.Printf("Ключ 'apple' существует, значение: %dn", val)
// Вывод: Ключ 'apple' существует, значение: 1
}
// Пытаемся получить значение по несуществующему ключу "banana"
val, ok = m["banana"]
if !ok {
fmt.Printf("Ключ 'banana' не существует. val имеет zero-value: %dn", val)
// Вывод: Ключ 'banana' не существует. val имеет zero-value: 0
}
}
Основные моменты:
-
Два возвращаемых значения: При доступе к
map
в формеval, ok := m[key]
, переменнаяok
будетtrue
, если ключ существует, иfalse
в противном случае. -
Проверка только наличия: Если само значение не нужно, можно использовать пустой идентификатор
_
, чтобы его проигнорировать. Это самый эффективный способ.if _, ok := m["orange"]; ok { fmt.Println("Ключ 'orange' точно есть в map!") }
-
Почему нельзя просто проверять значение? При обращении к несуществующему ключу
map
всегда возвращает нулевое значение (zero-value) для типа своих значений. Если у васmap[string]int
, то для отсутствующего ключа вернется0
. Но0
может быть и реальным значением, сохраненным вmap
. Поэтому проверкаif m["key"] != 0
ненадежна. -
Производительность Проверка наличия ключа в
map
— это очень быстрая операция, в среднем занимающая константное время O(1).