猿问

当键不在地图中时不引发错误(如 Python)有什么好处?

在 Go 中,letm是映射string到的映射对象int,假设"foo"不是 的键m,则语句

m["foo"]

返回两个值0falsefalse意味着"foo"不是 的键m。你能举出一些go的属性有用的情况,例子吗?


智慧大石
浏览 120回答 2
2回答

潇湘沐

在 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"] = truefruits["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? trueIs banana in the set? trueIs plum in the set? falseIs lemon in the set? false

qq_遁去的一_1

Go 不会引发错误。Go 报告错误。地图元素零值的常见用法:package mainimport (    "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 mainimport (    "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]]
随时随地看视频慕课网APP

相关分类

Go
我要回答