本笔记记录了学习go的基础语法过程,以及一些想法和比较。
go语言中的零值是当声明变量(即分配内存)但并未显式初始化时,为变量自动设置的一个默认初始值。 对于普通的值类型,则为0(数值类型)、false(bool类型)、空字符串(字符串类型); 而对于引用类型则均为nil,包括函数(function),接口(interface),指针(pointer),切片(slice),管道(channel),哈希表(map)等等。这里的nil类似c++的NULL,但是有一些区别,c++的NULL赋值给int时表示0,而go中不能将nil赋值给普通变量,也就是nil没有默认类型,即nil!=nil,但是变量未初始化时可以与nil比较,结果为true。
c++中会对全局变量和未初始化的静态变量进行类似的零值初始化,而对于局部变量则没有此操作。
在go中,用var声明变量时未初始化,而用:=时会声明并且初始化,不会赋予零值。
go中的空结构的占用空间与c++的空类不同,go占用0字节,而c++会占用1字节用于唯一标识这个类,确保此类的所有对象起始地址不同。
go test命令会自动读取源码所在目录下名为*_test.go的文件,生成并且运行对应的测试用可执行文件。-cover后缀查看此次测试的代码覆盖率,-v后缀显示此次测试的详细信息,如执行时间、运行结果等等。
go中的很多复杂一些的结构需要使用make方法初始化,如引用类型等等。
go中的channel即管道很有意思的一点是,向管道发送和接收数据使用类似箭头的运算符-><-,箭头的方向即为数据的流向。
针对线程通信(通常为go协程)的方式,go建议使用双向管道这个无锁的机制。除了双向管道(未标明方向),还有单向管道(chan<-和chan->创建),chan后跟类型名表示此管道传输的数据类型。