检查键是否在映射中作为“ if语句”条件存在

时间:2019-11-02 19:56:51

标签: go

我当时正在解决代码战中的katas,偶然发现了一种检查地图是否具有与给定键相关联的值的方法。下面的代码是我自己的虚拟示例,如果函数参数等于10,则返回(以非常低效的方式)“ bar”字符串。

我很难理解if语句在这里的工作原理。

func Bar(x int) string {

    var m = make(map[string]int)

    if x == 10 {
        m["bar"] = x
    }

    if _, ok := m["bar"]; ok {
        return "bar"
    }

    return "foo"
}

如果我使if语句看起来像这样(删除_

if ok := m["bar"];ok {

该代码无法运行,但是我不知道为什么。我不知道这种模式是否合适以及其背后的机制。目前,if仅评估布尔表达式,这似乎是一个肮脏的把戏。因此,我的理论是,_以某种方式使if语句认为它具有布尔条件,但是如果有人向正确的方向引导我,我将非常感激

1 个答案:

答案 0 :(得分:3)

有两种方法可以从地图中读取值。首先是:

x:=m[key]

这将检查m是否具有key的值,如果存在,它将为x分配该值的副本。否则,x的值为零。因此,如果m是一个map [int] int,那么如果key不在地图中,则x将具有0。这与给定密钥的m的值为0无关。

您可以使用第二种形式的地图读取:

x, ok:=m[key]

如果m的值为key,则将x设置为该值,并将ok设置为true。如果m没有key的值,这会将x设置为零值,并将ok设置为false

if _,ok:=m["bar"]; ok中,_忽略从映射返回的值,但是现在可以从ok的值知道映射是否包含密钥。 if语句首先评估一个赋值,然后检查条件,这里是布尔值ok

简而言之,if语句检查键是否在地图中,如果是,则执行某些操作。