以下是示例代码:
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{}
因此,struct的Zero值不是nil
,而是一个结构,所有属性都被初始化为零值。猜对了吗?
如果猜测正确,那么var ele A
和ele2 := A{}
的性质是否相同?我不确定。
答案 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)