首页 >后端开发 >Golang >如何同时高效地检查多个Go Map中某个key是否存在?

如何同时高效地检查多个Go Map中某个key是否存在?

Linda Hamilton
Linda Hamilton原创
2024-12-13 02:08:09292浏览

How Can I Efficiently Check for the Existence of a Key in Multiple Go Maps Simultaneously?

同时检查多个映射中的键是否存在

问题:

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn