【问题标题】:What is the default value of a map of structstruct映射的默认值是什么
【发布时间】:2019-02-01 17:51:19
【问题描述】:

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

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{}

【问题讨论】:

标签: go struct initialization default-value go-map


【解决方案1】:

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

当为变量分配存储空间时,无论是通过 声明或调用 new,或创建新值时,要么 通过复合文字或 make 调用,并且没有显式 提供初始化,变量或值被赋予默认值 价值。这种变量或值的每个元素都设置为零 其类型的值:布尔值为 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) 被分配存储在键“路由”下的值。如果该键不存在,则 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

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多