同时检查多个映射中的键是否存在
问题:
在 Go 中,什么时候检查多个映射中是否存在相同的键,一种方法是在 if 中使用 ok 标志条件,如下所示:
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
但是,最好将这两个条件浓缩为一个。这可以通过单个 if 语句来实现吗?
答案:
不幸的是,不可能使用单个 if 条件在多个映射中执行键存在性检查。 Go 语言规范要求 v, ok := m[k] 形式的赋值或初始化中的索引表达式(例如 map1["aaa"])产生一个额外的无类型布尔值 (ok)。
这意味着特殊的 v, ok := m[k] 形式只能在没有分配任何其他内容时使用。但是,如果映射的值类型是接口类型并且不使用 nil 值,则还有另一种方法。在这种情况下,您可以使用简单的元组分配:
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil { fmt.Printf("Both maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
要进一步简化此过程,您可以创建一个辅助函数来执行键检查并返回两个映射的值和 ok 标志:
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 maps contain key '%s': %v, %v\n", "aaa", v1, v2) }
通过利用这些技术,你可以有效地检查 Go 中多个映射中的键是否存在。
以上是如何同时高效地检查多个Go Map中某个key是否存在?的详细内容。更多信息请关注PHP中文网其他相关文章!