结构体的零值

问题描述 投票:0回答:3

这是示例代码:

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

是一样的

所以,结构体的零值不是

nil
,而是所有属性都初始化为零值的结构体。猜对了吗?

如果猜对了,那么

var ele A
ele2 := A{}
的性质是一样的吧?

struct go
3个回答
78
投票

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

当通过声明或调用 new 为变量分配存储空间时,或者创建新值时,通过复合文字或调用 make,且未提供显式初始化,该变量或value 被赋予默认值。

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

  • false
    对于布尔值,
  • 0
    对于整数,
  • 0.0
    用于浮标,
  • ""
    对于字符串,
  • nil
    用于指针、函数、接口、切片、通道和映射。

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

请注意,无法将结构体值设置为

nil
(但您可以将指向结构体的指针的值设置为
nil
)。


15
投票

我不认为得票最高的答案的措辞清楚地回答了这个问题,所以这里有一个更清晰的解释:

如果没有,arraystruct的元素的字段将被清零 值已指定。此初始化是递归完成的

type T struct {
    n int
    f float64
    next *T
}
fmt.Println([2]T{}) // [{0 0 <nil>} {0 0 <nil>}]

来源


2
投票

展示@Denys Sé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)
}
© www.soinside.com 2019 - 2024. All rights reserved.