我需要检查两个地图中是否存在相同的键:
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
是否可以将这两个条件合而为一?我设法做这样的事情:
v1, ok1 := map1["aaa"] v2, ok2 := map2["aaa"] if ok1 && ok2 { ... }
但我很好奇它是否可以在一种if情况下完成(分配和检查)。
if
不,这是不可能的。规格:索引表达式:
地图a上的索引表达式,其类型map[K]V用于特殊形式的赋值或初始化 v, ok = a[x] v, ok := a[x] var v, ok = a[x] 产生另一个无类型的布尔值。的值ok是true键x是否存在于映射中,否则为false。
地图a上的索引表达式,其类型map[K]V用于特殊形式的赋值或初始化
map[K]V
v, ok = a[x] v, ok := a[x] var v, ok = a[x]
产生另一个无类型的布尔值。的值ok是true键x是否存在于映射中,否则为false。
ok
true
x
因此,v, ok := m[k]只有在没有其他分配的情况下,才可以使用特殊形式。
v, ok := m[k]
但是,如果不使用映射的值类型的零值,则可以使用简单的元组分配进行检查;通过不使用特殊形式而是使用2个简单的索引表达式。
例如,如果您的值类型是某种接口类型(例如interface{}),并且您知道不使用该nil值,则可以执行以下操作:
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上尝试示例。