Struct 结构';golang中的s零值

Struct 结构';golang中的s零值,struct,go,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{} el

以下是示例代码:

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
关于
varelea
ele2:=A{}

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

如果猜测是正确的,那么
var ele A
ele2:=A{}
的性质是相同的,是正确的吗?

为什么要在有

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

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

  • false
    对于布尔型
  • 0
    对于整数
  • 0.0
    对于浮动
  • 用于字符串
  • 指针、函数、接口、切片、通道和映射的
    nil
此初始化是递归完成的,因此,例如,如果未指定值,则结构数组的每个元素的字段都将为零


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

展示了@Denys séguret的一流答案。此类变量或值的每个元素的类型()都设置为零值:

主程序包
输入“fmt”
func main(){
//布尔人错了,
var bl bool//false
//0表示数字类型,
int//0中的var
//”“对于弦,
var st string/“”
//指针、函数、接口、通道为零,
var pi*int//
var ps*字符串//
var fu func()//检查错误。https://stackoverflow.com/a/56663166/12817546
var-ir接口{}//
var ch chan string//
fmt.Println(基本法、内定法、圣约翰法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法、皮氏法
//切片,和地图。
var sl[]int//true
var mp映射[int]字符串//真
var pm*映射[int]字符串//
fmt.Printf(“%v%v%v\n”,sl==nil,mp==nil,pm)
}

我不认为得票最多的答案是明确的,因此这里有一个更清楚的解释:

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


本文档是否涵盖了简单结构的情况还不清楚。
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)
}