struct映射的默认值是什么

时间:2018-08-27 08:09:59

标签: go struct initialization default-value 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] == ? {}
}

我应该检查nil还是someStruct{}

1 个答案:

答案 0 :(得分:6)

每个字段的结构默认值为零,这取决于其类型。

  

为变量分配存储空间时,可以通过   声明或调用new,或者在创建新值时   通过复合文字或make的调用,并且没有显式   提供了初始化,为变量或值提供了默认值   值。此类变量或值的每个元素均设置为零   其类型的值:booleans为false,数字类型为0,“”为   字符串,而对于指针,函数,接口,切片,则为nil,   频道和地图。该初始化是递归完成的,因此对于   实例结构数组的每个元素都将具有其字段   如果未指定任何值,则清零。

type T struct { i int; f float64; next *T }
t := new(T)

以下内容成立:

t.i == 0
t.f == 0.0
t.next == nil

但是要根据键检查地图的值(如果存在),可以将其用作:

i, ok := m["route"]

在此语句中,第一个值(i)被分配了存储在键“ route”下的值。如果该键不存在,则i是值类型的零值(0)。第二个值(ok)是一个布尔值,如果该键存在于地图中,则为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)
}

Go playground