这是示例代码:
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{}
的性质是一样的吧?
当有一些文档时,为什么要(正确地)猜测?
当通过声明或调用 new 为变量分配存储空间时,或者创建新值时,通过复合文字或调用 make,且未提供显式初始化,该变量或value 被赋予默认值。
此类变量或值的每个元素都被设置为其类型的零值:
对于布尔值,false
对于整数,0
用于浮标,0.0
对于字符串,""
- 和
用于指针、函数、接口、切片、通道和映射。nil
此初始化是递归完成的,因此,例如,如果未指定值,则结构数组的每个元素都将其字段归零。
请注意,无法将结构体值设置为
nil
(但您可以将指向结构体的指针的值设置为 nil
)。
我不认为得票最高的答案的措辞清楚地回答了这个问题,所以这里有一个更清晰的解释:
如果没有,array或struct的元素的字段将被清零 值已指定。此初始化是递归完成的:
type T struct { n int f float64 next *T } fmt.Println([2]T{}) // [{0 0 <nil>} {0 0 <nil>}]
展示@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)
}