Dictionary 检查一个条件下的多个映射中是否存在密钥

Dictionary 检查一个条件下的多个映射中是否存在密钥,dictionary,go,Dictionary,Go,我需要检查两个地图中是否存在相同的密钥: if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... } 有可能把这两个条件合并成一个条件吗?我设法做到了这样: v1, ok1 := map1["aaa"] v2, ok2 := map2["aaa"] if ok1 && ok2 { ... } 但我很好奇,如果条件满足,它(分配和检查)是否可以在一个条件下完成。不,它不能完成

我需要检查两个地图中是否存在相同的密钥:

if v1, ok1 := map1["aaa"]; ok1 {
 ...
}
if v2, ok2 := map2["aaa"]; ok2 {
 ...
}
有可能把这两个条件合并成一个条件吗?我设法做到了这样:

v1, ok1 := map1["aaa"]
v2, ok2 := map2["aaa"]
if ok1 && ok2 {
 ...
}
但我很好奇,如果条件满足,它(分配和检查)是否可以在一个
条件下完成。

不,它不能完成

映射a上的一种索引表达式,类型为
map[K]V
,用于特殊形式的or初始化

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
生成一个额外的非类型化布尔值。如果映射中存在键
x
,则
ok
的值为
true
,否则为false

因此,只有在没有分配任何其他内容的情况下,才可以使用特殊的
v,ok:=m[k]
表单

但是,如果不使用映射的值类型,可以使用简单的元组赋值进行检查;不使用特殊形式,而是使用两个简单的索引表达式

例如,如果您的值类型是某个接口类型(例如,
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)
}

尝试上的示例。

您也可以使用可变参数(三个点)检查多个键:

// check map 1 and map2 is null or not
func checkMap(m1, m2 map[string]interface{}, keys ...string) []bool {
    var isExist []bool

    for key := range keys {
        //checking value from map 1
        _, ok := m1[keys[key]]
        if ok {
            isExist = append(isExist, true) // append for the first time to avoid panic
        } else {
            isExist = append(isExist, false) // append for the first time to avoid panic
        }

        // checking value from map2
        _, ok = m2[keys[key]]
        if ok {
            isExist[key] = true
        } else {
            isExist[key] = false
        }
    }

    return isExist
}
然后您可以按如下顺序检查钥匙:

result := checkMap(myMap, myMap2, "a", "b", "c", "d", "e", "f", "g")
fmt.Printf("result = %+v\n", result) // print the result

if result[0] {
    fmt.Println("key a exist in both map")
}

if result[1] {
    fmt.Println("key b exist in both map")
} 

对于golang来说,相对较新,我不得不说,
如果v1,v2,ok1,ok2:=idx(m1,m2,“aaa”);ok1和ok2{
看起来像是眼内黑色素瘤的一个危险因素。也称为眼癌。@jangroth我也不会使用它,但这是一种按照询问者的意愿去做的可能性。