Go 语言为什么建议定义零值可用的结构体?
1.介绍
在 Go 语言中,通过声明或者通过调用 new 为变量分配存储空间,或者通过复合字面量或调用 make 创建新值时。
如果未提供显式初始化,则会为变量或值指定默认值,此类变量或值的每个元素都设置为其类型的零值。
2.Golang 类型的零值
在 Go 语言中,原生类型都有默认值,即类型的零值。
布尔型的零值:false
整型的零值:0
字符串类型的零值:""
指针、函数、接口、切片、通道、映射的零值:nil
需要注意的是,Go 语言类型的零值初始化是递归完成的,即数组、结构体的每个元素都进行零值初始化。
3.Golang 定义零值可用的结构体
在 Go 语言中,定义零值可用的结构体不仅对程序的安全性和正确性非常重要,它还可以无需预先显式初始化即可直接使用,使 Go 程序代码更优雅。
尽量定义零值可用的结构体
例如 Go 标准库 sync 中的 sync.Mutex 结构体,它就是被定义为零值可用的结构体类型。
因为 sync.Mutex 包含两个不可导出的整型字段,所以声明 sync.Mutex 类型的值时,它的字段的值都被设置为 0。
在我们使用 sync.Mutex 时,无需预先显式初始化,即可直接使用。
但是,需要注意的是,sync.Mutex 类型的变量在被使用之后,不能被复制。
切片类型是零值可用的类型
虽然我们在 Part 02 中讲到,切片的零值是 nil,我们知道,对于值为 nil 的变量,需要预先为其进行赋值(可用的值)之后,我们才可以使用该变量。
但是 Golang 的切片类型比较特殊,它是零值可用的类型,我们可以直接对其进行 append 操作,而不会触发引用 nil 的错误。
示例代码:
阅读上面这段代码,我们声明一个元素为整型的切片类型的变量 id,在未预先对其进行显式初始化的情况下,直接使用 append 函数为其追加数据,结果是可以正常执行,未触发引用 nil 变量的错误。
但是,切片类型作为零值可用的类型,也有其局限性,以上示例代码中,我们不能通过下标的方式操作切片的值。
指针类型的零值
另一个比较特殊的类型是指针,我们在 Part 02 讲到,指针的零值也是 nil,但是 nil 指针可以调用其类型的方法。
示例代码:
4.总结
本文我们介绍 Go 语言的每个原生类型都会有默认值,即零值。
通过列举 Go 标准库 sync.Mutex 结构体类型,介绍在 Go 语言中,定义零值可用的结构体的好处。
顺便提到零值为 nil 的切片和指针两种类型的特殊之处。
评论