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

我正在解决代码战争中的 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声明认为它有一个布尔条件,但如果有人引导我走向正确的方向,我将非常感激


BIG阳
浏览 59回答 1
1回答

撒科打诨

有两种方法可以从地图中读取值。首先是:x:=m[key]这将检查 是否m有值key,如果有,它将分配该值的副本x。如果不是,x则其值为零。因此,如果m是一个,比如说,map[int]int,那么x如果 key 不在映射中,则值为 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 语句检查键是否在映射中,如果是,则执行某些操作。
打开App,查看更多内容
随时随地看视频慕课网APP