Ответ
Для проверки наличия ключа в 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).