为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
智慧大石 2023-06-05 09:14:05
在 Go 中,letm是映射string到的映射对象int,假设"foo"不是 的键m,则语句m["foo"]返回两个值0,false这false意味着"foo"不是 的键m。你能举出一些go的属性有用的情况,例子吗?
查看完整描述

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


查看完整回答
反对 回复 2023-06-05
?
qq_遁去的一_1

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


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信