我正在解决代码战争中的 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 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
有两种方法可以从地图中读取值。首先是:
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 语句检查键是否在映射中,如果是,则执行某些操作。
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报
0/150
提交
取消