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

久未见 提交于 2019-12-26 19:07:46

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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

并寻找钥匙,但是有没有更有效的方法来测试地图中钥匙的存在?

我在语言规范中找不到答案。


#1楼

在“ 坚果”电子邮件列表中进行搜索 ,找到了Peter Froehlich在2009年11月15日发布的解决方案。

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条件内部可见。


#2楼

一行答案:

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

说明:

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

  • 初始化两个变量val将接收来自映射的“ foo”值或“零值”(在这种情况下为空字符串),并且ok将收到一个布尔值,如果实际存在“ foo”,则该布尔值将设置为true在地图上

  • 计算ok ,如果“ foo”在地图中,则为true

如果映射中确实存在“ foo”,则将执行if语句的主体,而val将在该作用域内本地化。


#3楼

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

尝试使用映射中不存在的键来获取映射值时,将为映射中的条目类型返回零值。 例如,如果映射包含整数,则查找不存在的键将返回0。可以将集合实现为值类型为bool的映射。 将映射项设置为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]

由于明显的原因,这被称为“逗号可以”的成语。 在此示例中,如果存在tz,则将适当设置秒数,并且ok为true;否则,将为true。 如果不是,则将秒设置为零,确定为假。 这是一个将其与良好的错误报告结合在一起的函数:

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

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

_, present := timeZone[tz]

#4楼

    var empty struct{}
    var ok bool
    var m map[string]struct{}
    m = make(map[string]struct{})
    m["somestring"] = empty


    _, ok = m["somestring"]
    fmt.Println("somestring exists?", ok) 
    _, ok = m["not"]
    fmt.Println("not exists?", ok)

然后,运行maps.go somestring存在吗? 真的不存在吗? 假


#5楼

简短答案

_, exists := timeZone[tz]    // Just checks for key existence
val, exists := timeZone[tz]  // Checks for key existence and retrieves the value

这是Go Playground中示例

更长的答案

根据有效围棋地图部分:

尝试使用映射中不存在的键来获取映射值时,将为映射中的条目类型返回零值。 例如,如果映射包含整数,则查找不存在的键将返回0。

有时您需要从零值中区分出缺失的条目。 是否存在“ UTC”条目或该空字符串,因为它根本不在地图中? 您可以采用多种分配形式进行区分。

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

由于明显的原因,这被称为“逗号可以”的成语。 在此示例中,如果存在tz,则将适当设置秒数,并且ok为true;否则,将为true。 如果不是,则将秒设置为零,确定为假。 这是一个将其与良好的错误报告结合在一起的函数:

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

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

_, present := timeZone[tz]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!