Как в Go проверить, существует ли ключ в `map`?

Ответ

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

Основные моменты:

  1. Два возвращаемых значения: При доступе к map в форме val, ok := m[key], переменная ok будет true, если ключ существует, и false в противном случае.

  2. Проверка только наличия: Если само значение не нужно, можно использовать пустой идентификатор _, чтобы его проигнорировать. Это самый эффективный способ.

    if _, ok := m["orange"]; ok {
        fmt.Println("Ключ 'orange' точно есть в map!")
    }
  3. Почему нельзя просто проверять значение? При обращении к несуществующему ключу map всегда возвращает нулевое значение (zero-value) для типа своих значений. Если у вас map[string]int, то для отсутствующего ключа вернется 0. Но 0 может быть и реальным значением, сохраненным в map. Поэтому проверка if m["key"] != 0 ненадежна.

  4. Производительность Проверка наличия ключа в map — это очень быстрая операция, в среднем занимающая константное время O(1).