1。Go语言中介绍,当一个变量通过声明或调用new分配存储空间时,或者当通过复合字面量或调用make创建一个新值时。如果未提供显式初始化,则将默认值分配给变量或值,并将此类变量或值的每个元素设置为其类型的零值。2、Golang类型的零值在Go语言中,原生类型有一个默认值,即类型的零值。boolean类型的零值:false整数类型的零值:0字符串类型的零值:""指针、函数、接口、slice、channel、map的零值:nil需要注意的是Go语言类型的零值初始化是递归完成的,即数组和结构的每个元素都初始化为零值。3.Golang定义零值可用结构在Go语言中,定义零值可用结构不仅对程序的安全性和正确性非常重要,还可以直接使用而无需事先显式初始化,使得Go程序的代码更优雅。尝试定义一个可用值为零的结构体,比如Go标准库sync中的sync.Mutex结构体,它被定义为一个可用值为零的结构体类型。typeMutexstruct{stateint32semauint32}因为sync.Mutex包含两个不可导出的整型字段,当声明一个sync.Mutex类型的值时,其字段的值全部设置为0。当我们使用sync.互斥量,无需事先显式初始化即可直接使用。但是需要注意的是,sync.Mutex类型的变量使用后,是不能被复制的。切片类型是可用值为零的类型。虽然我们在Part02中提到了切片的零值是nil,但是我们知道对于值为nil的变量,我们需要预先给它们赋值(可用值),然后我们才能使用那个变量。但是Golang的slice类型比较特殊,它是一个零值可用的类型,我们可以直接追加它而不会触发引用nil的错误。示例代码:varid[]intid=append(id,1)id=append(id,2)fmt.Println(id)看上面的代码,我们声明了一个变量id,它的元素是一个整型切片类型,在如果它没有提前显式初始化,直接使用append函数给它添加数据,结果是可以正常执行,并没有触发引用nil变量的错误。但是,切片类型作为零值可用类型也有其局限性。在上面的示例代码中,我们无法通过下标来操作切片的值。零值指针类型另一种特殊类型是指针。我们在Part02中提到过,指针的零值也是nil,但是nil指针可以调用其类型的方法。示例代码:typeUserstruct{IdintNamestring}func(u*User)UserInfo()string{ifu==nil{return"Notfound"}returnfmt.Sprintf("{id:%d,name:%s}",u.Id,u.Name)}varu1*Userdata:=u1.UserInfo()fmt.Println(data)4.小结在本文中,我们介绍了Go语言的每一个原生类型都会有一个默认的值,即零值。通过列举Go标准库的sync.Mutex结构类型,介绍在Go语言中定义零值结构的好处。顺便说一句,零值nil的切片和指针有一些特别之处。
