【问题标题】: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{}?
【问题讨论】:
-
-
这在语言规范中也有提及:每个类型都有一个zero value,对于[索引表达式] mapping[key],该值是该类型的零值。
标签:
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