我当时正在解决代码战中的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
语句认为它具有布尔条件,但是如果有人向正确的方向引导我,我将非常感激
答案 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语句检查键是否在地图中,如果是,则执行某些操作。