【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
我知道我可以在地图迭代m
的,
for k, v := range m { ... }
并寻找钥匙,但是有没有更有效的方法来测试地图中钥匙的存在?
我在语言规范中找不到答案。
#1楼
在“ 坚果”电子邮件列表中进行搜索 ,找到了Peter Froehlich在2009年11月15日发布的解决方案。
package main
import "fmt"
func main() {
dict := map[string]int {"foo" : 1, "bar" : 2}
value, ok := dict["baz"]
if ok {
fmt.Println("value: ", value)
} else {
fmt.Println("key not found")
}
}
或者,更紧凑地说,
if value, ok := dict["baz"]; ok {
fmt.Println("value: ", value)
} else {
fmt.Println("key not found")
}
注意,使用这种形式的if
语句, value
和ok
变量仅在if
条件内部可见。
#2楼
一行答案:
if val, ok := dict["foo"]; ok {
//do something here
}
说明:
Go中的if
语句可以同时包含条件和初始化语句。 上面的示例同时使用:
初始化两个变量
val
将接收来自映射的“ foo”值或“零值”(在这种情况下为空字符串),并且ok
将收到一个布尔值,如果实际存在“ foo”,则该布尔值将设置为true
在地图上计算
ok
,如果“ foo”在地图中,则为true
如果映射中确实存在“ foo”,则将执行if
语句的主体,而val
将在该作用域内本地化。
#3楼
除了Go编程语言规范之外 ,您还应该阅读Effective Go 。 他们在地图部分中说:
尝试使用映射中不存在的键来获取映射值时,将为映射中的条目类型返回零值。 例如,如果映射包含整数,则查找不存在的键将返回0。可以将集合实现为值类型为bool的映射。 将映射项设置为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]
由于明显的原因,这被称为“逗号可以”的成语。 在此示例中,如果存在tz,则将适当设置秒数,并且ok为true;否则,将为true。 如果不是,则将秒设置为零,确定为假。 这是一个将其与良好的错误报告结合在一起的函数:
func offset(tz string) int { if seconds, ok := timeZone[tz]; ok { return seconds } log.Println("unknown time zone:", tz) return 0 }
要在地图中测试是否存在而不必担心实际值,可以使用空白标识符(_)代替该值的常规变量。
_, present := timeZone[tz]
#4楼
var empty struct{}
var ok bool
var m map[string]struct{}
m = make(map[string]struct{})
m["somestring"] = empty
_, ok = m["somestring"]
fmt.Println("somestring exists?", ok)
_, ok = m["not"]
fmt.Println("not exists?", ok)
然后,运行maps.go somestring存在吗? 真的不存在吗? 假
#5楼
简短答案
_, exists := timeZone[tz] // Just checks for key existence
val, exists := timeZone[tz] // Checks for key existence and retrieves the value
例
这是Go Playground中的示例 。
更长的答案
尝试使用映射中不存在的键来获取映射值时,将为映射中的条目类型返回零值。 例如,如果映射包含整数,则查找不存在的键将返回0。
有时您需要从零值中区分出缺失的条目。 是否存在“ UTC”条目或该空字符串,因为它根本不在地图中? 您可以采用多种分配形式进行区分。
var seconds int var ok bool seconds, ok = timeZone[tz]
由于明显的原因,这被称为“逗号可以”的成语。 在此示例中,如果存在tz,则将适当设置秒数,并且ok为true;否则,将为true。 如果不是,则将秒设置为零,确定为假。 这是一个将其与良好的错误报告结合在一起的函数:
func offset(tz string) int { if seconds, ok := timeZone[tz]; ok { return seconds } log.Println("unknown time zone:", tz) return 0 }
要在地图中测试是否存在而不必担心实际值,可以使用空白标识符(_)代替该值的常规变量。
_, present := timeZone[tz]
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3147828