2 回答
TA贡献1816条经验 获得超6个赞
在 Go 1 之前有一段时间使用不存在的键索引地图导致应用程序崩溃。这已更改为返回地图值类型的零值。这是一个设计决策,它允许(有限地)使用未初始化的语言结构而无需额外检查,从而简化了代码。
例如,你可以for range遍历nil切片和nil映射,你可以检查它们的长度等。结果当然是一样的:遍历切片nil或映射将导致零次迭代,切片和映射的长度nil为 0,但你不这样做需要if事先使用语句来判断该值是否为非nil(以便判断您是否可以对它们进行范围或索引)。
当不存在的键的零值有用时,PeterSO 已经展示了一个很好的例子:计数器。
另一个著名的例子是将地图用作集合。如果选择值类型为bool,则不必初始化不在集合中的值。索引映射会告诉您值(键)是否在集合中,如果不在,则booltype being的零值false会告诉您它不在集合中。
例如:
fruits := map[string]bool{}
// Add elements to the set:
fruits["apple"] = true
fruits["banana"] = true
// Test if elements are in the map:
fmt.Println("Is apple in the set?", fruits["apple"])
fmt.Println("Is banana in the set?", fruits["banana"])
fmt.Println("Is plum in the set?", fruits["plum"])
fmt.Println("Is lemon in the set?", fruits["lemon"])
输出(在Go Playground上尝试):
Is apple in the set? true
Is banana in the set? true
Is plum in the set? false
Is lemon in the set? false
TA贡献1725条经验 获得超7个赞
Go 不会引发错误。Go 报告错误。
地图元素零值的常见用法:
package main
import (
"fmt"
)
func main() {
counts := map[string]int{}
fmt.Println(counts)
// Equivalent:
// counts["foo"] = counts["foo"] + 1
// counts["foo"] += 1
// counts["foo"]++
counts["foo"]++
fmt.Println(counts)
counts["foo"]++
fmt.Println(counts)
}
游乐场: https: //play.golang.org/p/nvHBrgV_lFU
输出:
map[]
map[foo:1]
map[foo:2]
一个常用逗号、ok形式的map索引表达式:
package main
import (
"fmt"
)
func main() {
m := map[string]map[string]int{}
fmt.Println(m)
// panic: assignment to entry in nil map
// m["K1"]["K2"]++
_, ok := m["K1"]
if !ok {
m["K1"] = map[string]int{}
}
m["K1"]["K2"]++
fmt.Println(m)
m["K1"]["K2"]++
fmt.Println(m)
}
游乐场: https: //play.golang.org/p/9byxSSIWBre
输出:
map[]
map[K1:map[K2:1]]
map[K1:map[K2:2]]
- 2 回答
- 0 关注
- 119 浏览
添加回答
举报