Ответ 1
Нет, это невозможно. Spec: Индексные выражения:
Индексное выражение на карте a типа
map[K]V
, используемое в assignment или инициализации специальной формыv, ok = a[x] v, ok := a[x] var v, ok = a[x]
дает дополнительное нетипизированное логическое значение. Значение
ok
равноtrue
, если ключx
присутствует на карте, а false в противном случае.
Таким образом, вы можете использовать специальную форму v, ok := m[k]
, только если ничего не назначено.
Однако, если вы не используете нулевое значение для типа значения карты, вы можете выполнить проверку, используя простой кортеж-назначение; не используя специальную форму, кроме 2 простых индексных выражений.
Например, если ваш тип значения представляет собой некоторый тип интерфейса (например, interface{}
), и вы знаете, что не используете значение nil
, вы можете сделать следующее:
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil {
fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}
Конечно, с помощью вспомогательной функции вы можете сделать это за один шаг:
func idx(m1, m2 map[string]interface{}, k string) (
v1, v2 interface{}, ok1, ok2 bool) {
v1, ok1 = m1[k]
v2, ok2 = m2[k]
return
}
Используя его:
if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 {
fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}
Попробуйте примеры на Go Playground.