如何检查地图是否包含 Go 中的键?

新手上路,请多包涵

我知道我可以遍历地图 m

 for k, v := range m { ... }

并寻找一个键,但是是否有更有效的方法来测试键在地图中的存在?

原文由 grokus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 530
2 个回答

一行回答:

 if val, ok := dict["foo"]; ok {
    //do something here
}

解释:

if Go 中的语句可以同时包含条件语句和初始化语句。上面的例子同时使用了:

  • 初始化两个变量 - val 将从映射中接收“foo”的值或“零值”(在本例中为空字符串)和 ok 将接收一个布尔值将设置为 true 如果地图中实际存在“foo”

  • 评估 ok ,如果“foo”在地图中,它将是 true

如果地图中确实存在“foo”,则将执行 if 语句的主体,并且 val 将在该范围内。

原文由 marketer 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 The Go Programming Language Specification ,您还应该阅读 Effective Go 。在 地图 部分,他们说,除其他外:

尝试使用映射中不存在的键获取映射值将返回映射中条目类型的零值。例如,如果映射包含整数,查找不存在的键将返回 0。集合可以实现为值类型为 bool 的映射。将map条目设置为true将值放入集合中,然后通过简单的索引进行测试。

 attended := map[string]bool{
    "Ann": true,
    "Joe": true,
    ...
}

if attended[person] { // will be false if person is not in the map
    fmt.Println(person, "was at the meeting")
}

有时您需要区分缺失条目和零值。是否有“UTC”条目或 0 因为它根本不在地图中?您可以使用多重赋值的形式进行区分。

 var seconds int
var ok bool
seconds, ok = timeZone[tz]

由于显而易见的原因,这被称为“逗号 ok”成语。在此示例中,如果存在 tz,则秒数将被适当设置并且 ok 将为真;如果不是,seconds 将被设置为零并且 ok 将为 false。这是一个将它与一个漂亮的错误报告放在一起的函数:

 func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println("unknown time zone:", tz)
    return 0
}

要测试地图中的存在而不用担心实际值,您可以使用空白标识符 (_) 代替值的常用变量。

 _, present := timeZone[tz]

原文由 peterSO 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题