这是示例代码:
package main import ( "fmt" ) type A struct { Name string } func (this *A) demo(tag string) { fmt.Printf("%#v\n", this) fmt.Println(tag) } func main() { var ele A ele.demo("ele are called") ele2 := A{} ele2.demo("ele2 are called") }
运行结果:
&main.A{Name:""} ele are called &main.A{Name:""} ele2 are called
看起来这些var ele A和ele2 := A{}
var ele A
ele2 := A{}
因此,结构的零值不是nil,而是所有属性均初始化为零值的结构。猜对了吗?
nil
如果猜测是正确的,那么的自然var ele A和ele2 := A{}是一样的吧?
为什么要(正确地)猜测有一些文档?
当通过声明或调用new为变量分配存储空间时, 或者通过复合文字或make调用 创建新值时 ,并且未提供显式初始化时 ,将给出变量或值默认值。 此类变量或值的每个元素的类型均设置为零值 : false 对于布尔, 0 对于整数, 0.0 对于花车 "" 对于字符串, 以及nil指针,函数,接口,切片,通道和映射。 该初始化是递归完成的,因此,例如,如果未指定任何值,则结构数组的每个元素的字段都将为零。
当通过声明或调用new为变量分配存储空间时, 或者通过复合文字或make调用 创建新值时 ,并且未提供显式初始化时 ,将给出变量或值默认值。
此类变量或值的每个元素的类型均设置为零值 :
false
0
0.0
""
该初始化是递归完成的,因此,例如,如果未指定任何值,则结构数组的每个元素的字段都将为零。
请注意,无法将struct值设置为nil(但是您可以将指向struct的指针的值设置为nil)。