struct的映射的默认值是什么

tbr*_*den 2 struct initialization default-value go go-map

地图中struct的默认值是多少?如何检查地图值是否已初始化?

type someStruct struct { 
    field1 int
    field2 string
}
var mapping map[int]someStruct

func main() {
    mapping := make(map[int]someStruct)
}

func check(key int) {
    if mapping[key] == ? {}
}
Run Code Online (Sandbox Code Playgroud)

我应该检查nil还是someStruct{}

Him*_*shu 7

结构的默认值是每个字段的零值,根据其类型不同.

当通过声明或调用new为变量分配存储时,或者通过复合文字或make调用创建新值时,并且不提供显式初始化,则给出变量或值默认值.这种变量或值的每个元素都设置为其类型的零值:布尔值为false,数字类型为0,字符串为"",指针,函数,接口,切片,通道和映射为nil.这种初始化是递归完成的,因此,例如,如果没有指定值,则结构数组的每个元素都将其字段归零.

type T struct { i int; f float64; next *T }
t := new(T)
Run Code Online (Sandbox Code Playgroud)

以下内容:

t.i == 0
t.f == 0.0
t.next == nil
Run Code Online (Sandbox Code Playgroud)

但是,如果基于密钥检查映射的值(如果存在),则可以将其用作:

i, ok := m["route"]
Run Code Online (Sandbox Code Playgroud)

在该语句中,第一个值(i)被赋予存储在键"route"下的值.如果该键不存在,则i是值类型的零值(0).第二个值(ok)是bool,如果键存在于映射中,则为true,否则为false.

对于你的问题

我应该检查nil还是someStruct {}?

要检查初始化的空结构,可以检查为someStruct{}:

package main

import (
    "fmt"
)

type someStruct struct { 
    field1 int
    field2 string
}
var mapping map[int]someStruct

func main() {
    var some someStruct
    fmt.Println(some == (someStruct{}))
    //mapping := make(map[int]someStruct)
}
Run Code Online (Sandbox Code Playgroud)

去游乐场