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

时间:2019-01-28 17:14:29

标签: dictionary go

在Go中,让m是将string映射到int的映射对象,假设"foo"不是m的键,则语句< / p>

m["foo"]

返回两个值0false,其中false暗示"foo"不是m的键。 您能给出一些例子,例如go的属性有用吗?

2 个答案:

答案 0 :(得分:4)

在Go 1之前的某个时间,用不存在的键索引地图会导致应用程序崩溃。进行了更改,以返回映射的值类型的零值。这是一项设计决策,它允许(有限)使用未初始化的语言构造而无需额外检查,从而简化了代码。

例如,您可以在for range切片和nilnil,可以检查其长度等。结果当然是相同的:遍历nil slice或map的迭代次数为零,nil slice和map的长度为0,但是您无需事先使用if语句来判断该值是否为非{{1 }}(以告诉您是否可以覆盖它们或对其进行索引)。

当不存在的键的零值非常有用时,PeterSO已经展示了一个很好的例子:计数器。

另一个著名的例子是将地图用作集合。如果将值类型选择为nil,则不必初始化不在集合中的值。为地图建立索引会告诉您值(键)是否在集合中,如果不是,则bool类型的零值为bool会告诉您它不在集合中。

例如:

false

输出(在Go Playground上尝试):

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"])

答案 1 :(得分:2)

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]

逗号的常用用法,可以使用表单映射索引表达式:

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]]