Как отмечалось в других ответах, общее решение заключается в использовании индексного выражения в присваивании специальной формы:
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
Это красиво и чисто. Однако у него есть некоторые ограничения: это должно быть присвоение специальной формы. Выражение в правой части должно быть только выражением индекса карты, а список выражений в левой части должен содержать ровно 2 операнда: первый, которому присваивается тип значения, а второй, которому присваивается значение bool
. Первое значение результата этого специального выражения индекса формы будет значением, связанным с ключом, а второе значение скажет, существует ли на карте запись с данным ключом (если ключ существует на карте). Список выражений в левой части также может содержать пустой идентификатор , если один из результатов не нужен.
Важно знать, что если индексированное значение карты равно nil
или не содержит ключ, индексное выражение оценивается как нулевое значение типа значения карты. Так, например:
m := map[int]string{}
s := m[1] // s will be the empty string ""
var m2 map[int]float64 // m2 is nil!
f := m2[2] // f will be 0.0
fmt.Printf("%q %f", s, f) // Prints: "" 0.000000
Попробуйте на игровой площадке Go .
Так что, если мы знаем, что мы не используем нулевое значение на нашей карте, мы можем воспользоваться этим.
Например, если тип значения string
, и мы знаем, что никогда не сохраняем записи на карте, где значением является пустая строка (нулевое значение для типа string
), мы также можем проверить, является ли ключ в карте, сравнивая несвойственную форму (результат) выражения индекса с нулевым значением:
m := map[int]string{
0: "zero",
1: "one",
}
fmt.Printf("Key 0 exists: %t\nKey 1 exists: %t\nKey 2 exists: %t",
m[0] != "", m[1] != "", m[2] != "")
Вывод (попробуйте на Go Playground ):
Key 0 exists: true
Key 1 exists: true
Key 2 exists: false
На практике во многих случаях мы не храним значение нулевого значения на карте, поэтому его можно использовать довольно часто. Например, интерфейсы и типы функций имеют нулевое значение nil
, которое мы часто не храним в картах. Поэтому можно проверить, есть ли ключ на карте, сравнив его с nil
.
Использование этой «техники» имеет и другое преимущество: вы можете компактно проверить наличие нескольких ключей (вы не можете сделать это с помощью специальной формы «запятая нормально»). Подробнее об этом: Проверьте, существует ли ключ на нескольких картах в одном условии