我需要检查两个映射中是否存在相同的密钥:
if v1, ok1 := map1["aaa"]; ok1 {
...
}
if v2, ok2 := map2["aaa"]; ok2 {
...
}
Run Code Online (Sandbox Code Playgroud)
是否可以将这两个条件合二为一?我设法做了这样的事情:
v1, ok1 := map1["aaa"]
v2, ok2 := map2["aaa"]
if ok1 && ok2 {
...
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇它(分配和检查)是否可以在一个if
条件下完成.
不,它无法完成.规格:索引表达式:
map[K]V
用于特殊表单赋值或初始化的类型的映射a上的索引表达式Run Code Online (Sandbox Code Playgroud)v, ok = a[x] v, ok := a[x] var v, ok = a[x]
产生一个额外的无类型布尔值.的值
ok
是true
如果该键x
存在于地图,否则为假.
因此,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)
}
Run Code Online (Sandbox Code Playgroud)
当然,使用辅助函数,您可以一步完成:
func idx(m1, m2 map[string]interface{}, k string) (
v1, v2 interface{}, ok1, ok2 bool) {
v1, ok1 = m1[k]
v2, ok2 = m2[k]
return
}
Run Code Online (Sandbox Code Playgroud)
使用它:
if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 {
fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}
Run Code Online (Sandbox Code Playgroud)
试试Go Playground上的例子.