我知道我可以遍历地图 m
for k, v := range m { ... }
并寻找一个键,但是是否有更有效的方法来测试键在地图中的存在?
原文由 grokus 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道我可以遍历地图 m
for k, v := range m { ... }
并寻找一个键,但是是否有更有效的方法来测试键在地图中的存在?
原文由 grokus 发布,翻译遵循 CC BY-SA 4.0 许可协议
除了 The Go Programming Language Specification ,您还应该阅读 Effective Go 。在 地图 部分,他们说,除其他外:
尝试使用映射中不存在的键获取映射值将返回映射中条目类型的零值。例如,如果映射包含整数,查找不存在的键将返回 0。集合可以实现为值类型为 bool 的映射。将map条目设置为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]
由于显而易见的原因,这被称为“逗号 ok”成语。在此示例中,如果存在 tz,则秒数将被适当设置并且 ok 将为真;如果不是,seconds 将被设置为零并且 ok 将为 false。这是一个将它与一个漂亮的错误报告放在一起的函数:
func offset(tz string) int { if seconds, ok := timeZone[tz]; ok { return seconds } log.Println("unknown time zone:", tz) return 0 }
要测试地图中的存在而不用担心实际值,您可以使用空白标识符 (_) 代替值的常用变量。
_, present := timeZone[tz]
原文由 peterSO 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答914 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.2k 阅读
一行回答:
解释:
if
Go 中的语句可以同时包含条件语句和初始化语句。上面的例子同时使用了:初始化两个变量 -
val
将从映射中接收“foo”的值或“零值”(在本例中为空字符串)和ok
将接收一个布尔值将设置为true
如果地图中实际存在“foo”评估
ok
,如果“foo”在地图中,它将是true
如果地图中确实存在“foo”,则将执行
if
语句的主体,并且val
将在该范围内。