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

好的,根据这个:

如何检查地图是否包含 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{}


慕慕森
浏览 92回答 2
2回答

幕布斯6054654

Go 编程语言规范索引表达式对于映射类型 M 的 a:如果映射为 nil 或不包含这样的条目,则 a[x] 是 M 的元素类型的零值。零值当通过声明或调用 new 为变量分配存储空间时,或者通过复合文字或调用 make 创建新值时,并且没有提供显式初始化,则给出变量或值一个默认值。此类变量或值的每个元素都设置为其类型的零值:布尔值为 false,数字类型为 0,字符串为 "",指针、函数、接口、切片、通道和映射为 nil。Go 编程语言规范复合文字复合文字为结构体、数组、切片和映射构造值,并在每次计算它们时创建一个新值。它们由文字类型和后跟大括号绑定的元素列表组成。每个元素前面可以有一个相应的键。对于结构文字,以下规则适用:文字可以省略元素列表;这样的文字对其类型求值为零值。对于您的示例,键入struct{},省略复合文字中的元素列表,struct{}{},作为零值。例如,package mainimport "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 {} {} == {} falseGo 编程语言规范变量声明变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予一个类型和一个初始值。如果给出了一个表达式列表,则变量将使用遵循赋值规则的表达式进行初始化。否则,每个变量都被初始化为其零值。如果存在类型,则每个变量都被赋予该类型。否则,每个变量在赋值中被赋予相应初始化值的类型。在您的示例中,您可以声明一个没有初始值的类型变量struct{},该变量将被初始化为该struct{}类型的零值。例如,package mainimport "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

开心每一天1111

你当然可以做你上面所做的。与 nil 进行比较取决于您在 map 中的值类型。如果是,interface{}你可以将它与 nil 进行比较:m := map[string]interface{}{}val, _ := m["foo"]if val == nil {    fmt.Println("no index")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go