检查map是否包含Go中的一个键的方法

311 阅读1分钟

要检查一个给定的键是否存在于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中的地图是否包含一个给定的键,是一个更好的主意。