确定多个映射中的键是否存在
使用多个映射时,通常需要检查所有映射中是否存在特定键他们。虽然以下方法很常见:
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
它涉及多个 if 语句。是否有更简洁的方法在一种条件下执行此检查?
压缩语法的尝试
一种可能的解决方案是评估两个映射中的键是否存在,然后检查它们的交集:
v1, ok1 := map1["aaa"] v2, ok2 := map2["aaa"] if ok1 && ok2 { ... }
但是,这种方法需要分配和检查两个单独的
单条件键检查的限制
事实证明,Go 语言不允许在单个 if 条件下检查多个键是否存在。根据 Go 规范,映射上的索引表达式会生成一个额外的布尔值,指示键是否存在。这种特殊语法只能用在赋值或初始化中。
因此,不可能仅使用特殊的 v, ok := m[k] 形式来执行组合键存在性检查。
Key 存在性检查的替代方案
如果映射的值类型是接口类型并且可以保证为了不存在 nil 值,另一种方法是使用元组赋值来检查键是否存在:
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil { ... }
对于更复杂的情况,可以创建一个辅助函数来封装键存在检查逻辑:
func idx(m1, m2 map[string]interface{}, k string) ( v1, v2 interface{}, ok1, ok2 bool) { v1, ok1 = m1[k] v2, ok2 = m2[k] return } // Usage example: if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 { ... }
以上是如何在单一条件下有效检查多个 Go Map 中的键是否存在?的详细内容。更多信息请关注PHP中文网其他相关文章!