结构在golang中的零值

soa*_*bar 20 struct go

这是示例代码:

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")
}
Run Code Online (Sandbox Code Playgroud)

运行结果:

&main.A{Name:""}
ele are called
&main.A{Name:""}
ele2 are called
Run Code Online (Sandbox Code Playgroud)

它看起来像那些是相同的约var ele Aele2 := A{}

因此,struct的Zero值不是nil,而是一个结构,所有属性都被初始化为零值.猜对了吗?

如果猜测是正确的,那么的自然var ele Aele2 := A{}是一样的吧?我不确定.

Den*_*ret 46

为什么在有一些文档时(正确地)猜测?

当通过声明或调用new为变量分配存储时,或者通过复合文字或make调用创建新值时,并且不提供显式初始化,则给出变量或值默认值.

此类变量或值的每个元素都设置为其类型的零值:

  • false 对于布尔,
  • 0 对于整数,
  • 0.0 用于花车,
  • "" 对于字符串,
  • 以及nil指针,函数,接口,切片,通道和映射.

这种初始化是递归完成的,因此,例如,如果没有指定值,则结构数组的每个元素都将其字段归零.

请注意,没有办法将struct值设置为nil(但您可以设置指向struct的指针的值nil).


Jos*_*ehl 7

我不相信最高投票的答案措辞明确来回答这个问题,所以这里有一个更清楚的解释:

“如果没有指定值,数组或结构的元素将把它的字段归零。这个初始化是递归完成的:”

来源