要检查一个给定的键是否存在于Go中的地图中,使用特殊形式的索引表达式
v, ok := a[k]
该表达式返回两个元素--带有键k 的地图值v ,如果键k 存在于地图中,则返回一个等于true 的布尔值ok 。如果没有,ok 是假的。
例子
data := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}
val, ok := data["a"]
fmt.Println(val, ok)
val, ok = data["d"]
fmt.Println(val, ok)
输出
1 true
0 false
如何在if语句中直接检查一个键是否存在于地图中
在日常编码中,一个常见的情况是,你只想在地图中存在一个给定的键时执行某段代码。在Go中,你可以通过将if 语句与地图索引表达式结合起来来实现。
if val, ok := data["a"]; ok {
fmt.Println(val, ok)
}
if val, ok := data["d"]; ok {
fmt.Println(val, ok)
}
输出
1 true
If 语句前面可以有简单的语句,允许你在 ,在评估之前直接分配map值。
为什么对零值的检查是不够的?
你可能想知道为什么我们不能使用更简单的map index表达式,它返回一个单一的值,并检查它是否是零值。
if data["a"] != 0 {
fmt.Println("key a exists")
}
输出
key a exists
如果你确定你的地图不包含零值,那么它就能正常工作。否则,结果将是不正确的。
// incorrect result
data["d"] = 0
if data["d"] != 0 {
fmt.Println("key d exists")
} else {
fmt.Println("key d does not exist")
}
输出:如果你确定你的地图不包含零值,它就能正常工作。
key d does not exist
由于这个原因,使用双值地图索引表达式来检查Go中的地图是否包含一个给定的键,是一个更好的主意。