结构在golang中的零值

时间:2015-02-20 09:41:16

标签: 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")
}

运行结果:

&main.A{Name:""}
ele are called
&main.A{Name:""}
ele2 are called

var ele Aele2 := A{}

看起来是一样的

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

如果猜测正确,那么var ele Aele2 := A{}的性质是否相同?我不确定。

3 个答案:

答案 0 :(得分:39)

为什么猜测(正确)何时有some documentation

  

当为变量分配存储时,通过声明或调用new,或者创建新值时,通过复合文字或调用make,并且不提供显式初始化< / strong>,变量或值被赋予默认值。

     

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

     
      
  • false表示布尔,
  •   
  • 0表示整数,
  •   
  • 0.0 for floats,
  •   
  • ""表示字符串,
  •   
  • nil用于指针,函数,接口,切片,通道和映射。
  •   
     

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

请注意,无法将结构值设置为nil(但您可以将指向结构的指针的值设置为nil)。

答案 1 :(得分:0)

展示@DenysSéguret的一流答案。此类变量或值的每个元素的类型(https://golang.org/ref/spec#The_zero_value)均设置为零值:

package main

import "fmt"

func main() {
    // false for booleans,
    var bl bool // false
    //0 for numeric types,
    var in int // 0
    // "" for strings,
    var st string // ""
    // and nil for pointers, functions, interfaces, channels,
    var pi *int    // <nil>
    var ps *string // <nil>
    var fu func()      // <nil> Go vet error. https://stackoverflow.com/a/56663166/12817546
    var ir interface{} // <nil>
    var ch chan string // <nil>
    fmt.Println(bl, in, st, pi, ps, fu, ir, ch)
    // slices, and maps.
    var sl []int          // true
    var mp map[int]string // true
    var pm *map[int]string // <nil>
    fmt.Printf("%v %v %v\n", sl == nil, mp == nil, pm)
}

答案 2 :(得分:0)

我不认为投票最明确的答案的措词可以用来回答问题,所以这里有一个更清晰的解释:

“如果未指定任何值,则数组或结构的元素的字段将为零。此初始化以递归方式进行:”

Source