Dictionary 当键不在映射中时,不引发错误(如Python)有什么好处?

Dictionary 当键不在映射中时,不引发错误(如Python)有什么好处?,dictionary,go,Dictionary,Go,在Go中,让m是将字符串映射到int的映射对象,假设foo不是m的键,那么 m["foo"] 返回两个值0和false,其中false表示foo不是m的键。 你能给出一些go属性有用的情况和例子吗 Go不会引起错误。Go报告错误 映射元素零值的常见用法: package main import ( "fmt" ) func main() { counts := map[string]int{} fmt.Println(counts) // Equivale

在Go中,让m是将字符串映射到int的映射对象,假设foo不是m的键,那么

m["foo"]
返回两个值0和false,其中false表示foo不是m的键。
你能给出一些go属性有用的情况和例子吗

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)
}
游乐场:

输出:

map[]
map[foo:1]
map[foo:2]
map[]
map[K1:map[K2:1]]
map[K1:map[K2:2]]
逗号ok表单映射索引表达式的常见用法:

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)
}
游乐场:

输出:

map[]
map[foo:1]
map[foo:2]
map[]
map[K1:map[K2:1]]
map[K1:map[K2: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)
}
游乐场:

输出:

map[]
map[foo:1]
map[foo:2]
map[]
map[K1:map[K2:1]]
map[K1:map[K2:2]]
逗号ok表单映射索引表达式的常见用法:

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)
}
游乐场:

输出:

map[]
map[foo:1]
map[foo:2]
map[]
map[K1:map[K2:1]]
map[K1:map[K2:2]]

在Go 1之前有一段时间,使用不存在的密钥索引地图导致应用程序崩溃。这已更改为返回映射值类型的零值。这是一个设计决策,允许在不进行额外检查的情况下使用有限的未初始化语言结构,从而简化了代码

例如,您可以为零切片和零贴图上的范围检查它们的长度等。结果当然是相同的:迭代零切片或贴图将导致零迭代,零切片和贴图的长度为0,但是,您不需要事先使用if语句来判断值是否为非nil,以便判断您是否可以覆盖它们或对它们进行索引

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

另一个著名的例子是用作集合的地图。如果选择值类型为bool,则不必初始化不在集合中的值。索引映射会告诉您键是否在集合中,如果不在集合中,bool type的零值为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 1之前有一段时间,使用不存在的密钥索引地图导致应用程序崩溃。这已更改为返回映射值类型的零值。这是一个设计决策,允许在不进行额外检查的情况下使用有限的未初始化语言结构,从而简化了代码

例如,您可以为零切片和零贴图上的范围检查它们的长度等。结果当然是相同的:迭代零切片或贴图将导致零迭代,零切片和贴图的长度为0,但是,您不需要事先使用if语句来判断值是否为非nil,以便判断您是否可以覆盖它们或对它们进行索引

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

另一个著名的例子是用作集合的地图。如果选择值类型为bool,则不必初始化不在集合中的值。索引映射会告诉您键是否在集合中,如果不在集合中,bool type的零值为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中,错误是返回值。在映射的情况下,唯一可能的错误是请求的键不存在,因此它可能只是一个布尔值。然而,要知道任何设计决策背后的真实答案,你需要问设计师,而不是整个社区;它不清楚或没有用处。最重要的是,还不清楚。考虑M:= MaMeMAP[String ] int;x:=m[foo];m[foo]=x+1实际上与人们更熟悉的var v int没有什么不同;x:=v;v=x+1。在这两个示例中,第二步获取int的零值,并向其中添加一个,然后将其分配回用于在第一步中读取零值的变量。对于map,首先创建该变量。另外,不要忘记Go中的map访问可能使用两个参数形式:v,ok:=map[key],因此可以使用if v,ok:=map[key]!好的{panicboom}。。。如果你愿意的话。这并不比在不存在的键上出现地图恐慌更复杂,如果程序员想要不同的行为,就必须捕获它们。这并不清楚,因为你使用的术语在围棋的上下文中毫无意义。Go从来不会引起错误,因为它从来不会引起任何问题。所以不清楚你的意思是什么,或者你期望的行为是什么。这取决于你所说的提出错误是什么意思;在Go中,错误是返回值。在映射的情况下,唯一可能的错误是请求的键不存在,因此它可能只是一个布尔值。然而,要知道任何设计决策背后的真实答案,你需要问设计师,而不是整个社区;它不清楚或没有用处。最重要的
确切地说,还不清楚。考虑M:= MaMeMAP[String ] int;x:=m[foo];m[foo]=x+1实际上与人们更熟悉的var v int没有什么不同;x:=v;v=x+1。在这两个示例中,第二步获取int的零值,并向其中添加一个,然后将其分配回用于在第一步中读取零值的变量。对于map,首先创建该变量。另外,不要忘记Go中的map访问可能使用两个参数形式:v,ok:=map[key],因此可以使用if v,ok:=map[key]!好的{panicboom}。。。如果你愿意的话。这并不比在不存在的键上出现地图恐慌更复杂,如果程序员想要不同的行为,就必须捕获它们。这并不清楚,因为你使用的术语在围棋的上下文中毫无意义。Go从来不会引起错误,因为它从来不会引起任何问题。所以不清楚你的意思,或者你期望的行为是什么。我删除了问题中的“提出错误”部分。你能给出更多关于go属性有用的情况吗?@ydhhat:请看我修改过的答案。我删除了问题中的“提出错误”部分。你能给出更多关于go属性有用的情况吗?@ydhhat:请看我修改过的答案。