如何检查地图中是否包含密钥?
我知道我可以迭代地图m,
for k, v := range m { ... }
并寻找一个关键,但有没有一种更有效的方法来测试密钥在地图中的存在? 谢谢。 我无法在语言规范中找到答案。
一行答案:
if val, ok := dict["foo"]; ok {
//do something here
}
说明:
if
Go中的语句可以同时包含一个条件和一个初始化语句。 上面的例子使用了两个:
初始化两个变量 - val
会从map中获得“foo”的值或者是一个“零值”(在这个例子中是空字符串), ok
会收到一个bool,如果实际存在“foo”,它将被设置为true
在地图中
评估ok
,如果地图中有“foo”,则结果为true
如果地图中确实存在“foo”,那么if
语句的主体将被执行,并且val
将在该范围内是本地的。
编辑:下面的答案在Go 1之前。从Go 1开始,它不再是准确/有效的。
除了Go编程语言规范外,您还应阅读Effective Go。 在地图部分,他们说,除其他外:
“尝试使用地图中不存在的键获取地图值会导致程序崩溃,但是有一种方法可以安全地使用多个分配。”
var seconds int
var ok bool
seconds, ok = timeZone[tz]
“为了测试地图中的存在而不用担心实际值,可以使用空白标识符,简单的下划线(_)。可以为任何类型的值分配或声明空白标识符,并且无害地丢弃该值。为了测试地图中的存在性,请使用空白标识符代替值的常用变量。“
_, present := timeZone[tz]
在坚固的电子邮件列表中搜索并找到了Peter Froehlich在11/15/2009发布的解决方案。
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
条件内可见。