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

如果某物不在地图中,返回值取什么值?

如果某物不在地图中,返回值取什么值?

Go
慕慕森 2023-05-04 16:43:31
好的,根据这个:如何检查地图是否包含 go 中的键?if val, ok := m["foo"]; ok {    //do something here}很好,但是为什么我们不能这样做:val, ok := m["foo"]if val == nil {   // cannot compare val to nil}我收到一个编译错误,说我无法将 val 与 nil 进行比较,但是 val 有什么价值呢?我可以将它与什么进行比较,以确定它是否存在?m 的类型如下:type m map[string]struct{}
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Go 编程语言规范

索引表达式

对于映射类型 M 的 a:如果映射为 nil 或不包含这样的条目,则 a[x] 是 M 的元素类型的零值。

零值

当通过声明或调用 new 为变量分配存储空间时,或者通过复合文字或调用 make 创建新值时,并且没有提供显式初始化,则给出变量或值一个默认值。此类变量或值的每个元素都设置为其类型的零值:布尔值为 false,数字类型为 0,字符串为 "",指针、函数、接口、切片、通道和映射为 nil。


Go 编程语言规范

复合文字

复合文字为结构体、数组、切片和映射构造值,并在每次计算它们时创建一个新值。它们由文字类型和后跟大括号绑定的元素列表组成。每个元素前面可以有一个相应的键。对于结构文字,以下规则适用:

文字可以省略元素列表;这样的文字对其类型求值为零值。

对于您的示例,键入struct{},省略复合文字中的元素列表,struct{}{},作为零值。

例如,

package main


import "fmt"


func main() {

    m := map[string]struct{}{}

    val, ok := m["foo"]

    fmt.Printf("%T %v\n", val, val)

    if val == struct{}{} {

        fmt.Println("==", val, ok)

    }

}

输出:

struct {} {}
== {} false

Go 编程语言规范

变量声明

变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予一个类型和一个初始值。

如果给出了一个表达式列表,则变量将使用遵循赋值规则的表达式进行初始化。否则,每个变量都被初始化为其零值。

如果存在类型,则每个变量都被赋予该类型。否则,每个变量在赋值中被赋予相应初始化值的类型。

在您的示例中,您可以声明一个没有初始值的类型变量struct{},该变量将被初始化为该struct{}类型的零值。

例如,

package main


import "fmt"


func main() {

    m := map[string]struct{}{}

    val, ok := m["foo"]

    fmt.Printf("%T %v\n", val, val)

    var zeroValue struct{}

    if val == zeroValue {

        fmt.Println("==", val, ok)

    }

}

输出:


struct {} {}

== {} false


查看完整回答
反对 回复 2023-05-04
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

你当然可以做你上面所做的。与 nil 进行比较取决于您在 map 中的值类型。如果是,interface{}你可以将它与 nil 进行比较:


m := map[string]interface{}{}


val, _ := m["foo"]


if val == nil {

    fmt.Println("no index")

}


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

添加回答

举报

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