不,不能这样做。 Spec: Index expressions:
map[K]V 类型的映射 a 上的索引表达式用于 assignment 或特殊形式的初始化
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
产生一个额外的无类型布尔值。如果映射中存在键 x,则 ok 的值为 true,否则为 false。
因此,只有在没有分配任何其他内容的情况下,您才能使用特殊的 v, ok := m[k] 表单。
但是,如果不使用map的值类型zero value,可以使用简单的tuple-assignment进行检查;不使用特殊形式,而是使用 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 上的示例。