《Go语言精进之路》读书笔记 | 尽量定义零值可用的类型

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Go语言精进之路》读书笔记 | 尽量定义零值可用的类型相关的知识,希望对你有一定的参考价值。

书籍来源:《Go语言精进之路:从新手到高手的编程思想、方法和技巧》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Go语言精进之路》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


在Go语言中,零值可以避免了变量值不确定可能带来的潜在问题。

11.1 Go类型的零值

Go语言中的每个原生类型都有其默认值,这个默认值就是这个类型的零值。

所有整型类型:0 浮点类型:0.0 布尔类型:false字 符串类型:"" 指针、interface、切片(slice)、channel、map、function:nil

另外,数组、结构体等类型会对其组成元素逐一进行零值初始化。

11.2 零值可用

我们知道了Go类型的零值,接下来了解可用。Go从诞生以来就一直秉承着尽量保持“零值可用”的理念,来看两个例子。

第一个例子是关于切片的:

var zeroSlice []int
zeroSlice = append(zeroSlice, 1)
zeroSlice = append(zeroSlice, 2)
zeroSlice = append(zeroSlice, 3)
fmt.Println(zeroSlice) // 输出:[1 2 3]
复制代码

我们声明了一个[]int类型的切片zeroSlice,但并没有对其进行显式初始化,由于Go中的切片类型具备零值可用的特性,我们可以直接对其进行append操作,而不会出现引用nil的错误。

第二个例子是通过nil指针调用方法:

// chapter3/sources/call_method_through_nil_pointer.go

func main() 
    var p *net.TCPAddr
    fmt.Println(p) //输出:<nil>

复制代码

我们声明了一个net.TCPAddr的指针变量,但并未对其显式初始化,指针变量p会被Go编译器赋值为nil。在标准输出上输出该变量,fmt.Println会调用p.String()。查看TCPAddr这个类型的String方法,会发现值为nil的TCPAddr指针变量依然可以调用String方法。

在Go标准库和运行时代码中还有很多践行“零值可用”理念的好例子,最典型的莫过于sync.Mutex和bytes.Buffer了。

var mu sync.Mutex
mu.Lock()
mu.Unlock()
复制代码

Go标准库的设计者将sync.Mutex结构体的零值设计为可用状态,让Mutex的调用者可以省略对Mutex的初始化而直接使用Mutex。

Go标准库中的bytes.Buffer亦是如此:

// chapter3/sources/bytes_buffer_write.go
func main() 
    var b bytes.Buffer
    b.Write([]byte("Effective Go"))
    fmt.Println(b.String()) // 输出:Effective Go

复制代码

无须对bytes.Buffer类型的变量b进行任何显式初始化,即可直接通过b调用Buffer类型的方法进行写入操作。

以上是关于《Go语言精进之路》读书笔记 | 尽量定义零值可用的类型的主要内容,如果未能解决你的问题,请参考以下文章

《Go语言精进之路》读书笔记 | 理解Go语言的设计哲学

《Go语言精进之路》读书笔记 | 选择适当的Go语言版本

《Go语言精进之路》读书笔记 | 理解Go语言的包导入

《Go语言精进之路》读书笔记 | 了解Go语言的诞生与演进

《Go语言精进之路》读书笔记 | 使用一致的变量声明形式

《Go语言精进之路》读书笔记 | 理解Go语言代码块与作用域