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我也不会使用它,但这是一种按照询问者的意愿去做的可能性。