如何检查地图中是否包含密钥?

我知道我可以迭代地图m,

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

并寻找一个关键,但有没有一种更有效的方法来测试密钥在地图中的存在? 谢谢。 我无法在语言规范中找到答案。


一行答案:

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

说明:

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

  • 初始化两个变量 - val会从map中获得“foo”的值或者是一个“零值”(在这个例子中是空字符串), ok会收到一个bool,如果实际存在“foo”,它将被设置为true在地图中

  • 评估ok ,如果地图中有“foo”,则结果为true

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


    编辑:下面的答案在Go 1之前。从Go 1开始,它不再是准确/有效的。


    除了Go编程语言规范外,您还应阅读Effective Go。 在地图部分,他们说,除其他外:

    “尝试使用地图中不存在的键获取地图值会导致程序崩溃,但是有一种方法可以安全地使用多个分配。”

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

    “为了测试地图中的存在而不用担心实际值,可以使用空白标识符,简单的下划线(_)。可以为任何类型的值分配或声明空白标识符,并且无害地丢弃该值。为了测试地图中的存在性,请使用空白标识符代替值的常用变量。“

    _, present := timeZone[tz]
    

    在坚固的电子邮件列表中搜索并找到了Peter Froehlich在11/15/2009发布的解决方案。

    package main
    
    import "fmt"
    
    func main() {
            dict := map[string]int {"foo" : 1, "bar" : 2}
            value, ok := dict["baz"]
            if ok {
                    fmt.Println("value: ", value)
            } else {
                    fmt.Println("key not found")
            }
    }
    

    或者更简洁地说,

    if value, ok := dict["baz"]; ok {
        fmt.Println("value: ", value)
    } else {
        fmt.Println("key not found")
    }
    

    请注意,使用if语句的这种形式, valueok变量只在if条件内可见。

    链接地址: http://www.djcxy.com/p/23991.html

    上一篇: How to check if a map contains a key in go?

    下一篇: Get index or key given the value in java Map