go语言实战第二章读书笔记
包
包名
每个文件都必须一个包里面,通常来说包名和文件夹名相同,也就意味着一个文件夹下面的所有文件的包名必须相同的。
例如有以下目录结构
1 | sample |
那么以search文件夹为例,文件夹中的文件的包名都应该如下
1 | package search |
Main包
main函数会在main包里面出现,同理,main函数是go语言程序的入口地点。但是go语言包中还有另一个函数init()函数,init函数用于初始化整个包,因此假如main包中有init函数,也会先执行init(所有使用到的包中的init,顺序是导入包,初始化包,本包,并非只是main的init)函数在执行main函数。
假如main包中没有main函数,那么构建出来的文件将会以库文件的形式存在,即不会生成可执行文件。
import
用于导入需要的包,假如需要导入的包很多,可以以以下形式导入包
1 | import |
由于go语言不允许导入某个包而不使用,但是我们需要初始化某个包时但又不去使用它,那么应该在导入包名时在其前面加入_,使得go语言编译器接受这个包。例如我们想初始化matchers包。可以使用如下方法
1 | import ( |
标准库
每个代码文件都以 package 关键字开头,随后跟着包的名字。文件夹 search 下的每个代码文件都使用 search 作为包名。例如”fmt”,”log”。与第三方包不同,从标准库中导入代码时,只需要给出要导入的包名。编译器查找包的时候,总是会到 GOROOT 和 GOPATH 环境变量。
1 | GOROOT="/User/username/go" |
作用域
在go语言中,包内大写字母开头的函数或者变量名表示外部可见,即可以提供给掉包者使用,小写字母开头的函数或者变量着表示仅包内可见,因此go语言不存在什么文件本地变量或本地函数,隔离级别以包进行区分。假如一个公开的函数(大写字母开头的函数)返回了一个不公开的变量(小写字母开头的变量),外部成员依然是可以访问这个值。
初始化
在go语言中,所有数值类型都会被初始化为0值,所有非数值类型都会被初始化为nil(nullptr),对于bool类型来说,零值为false,值得一题的是go语言中的bool类型和数值类型不能直接转化。(0不等于false,非零不等于true)
循环
go语言中只有for循环,没有while和do while,可以使用for循环来实现while的类型效果。
range关键字
range通常关键字配合for循环使用,他能保证变量目标容器中的所有元素并且不发生越界,由于range会提供下标索引和copyvalue俩种方式,在实际使用时并非俩者都需要使用的,因此便有了如下这种写法
1 | for i,it := range arr { // i为下标,it为copy value |
我们可以使用_下划线来表示此变量我们忽略,不需要使用,此时编译不会因为该变量未使用而报错。
闭包
go语言支持闭包,也支持匿名闭包,由于声明函数使用func关键字,执行时只需要配合()即可,因此有了如下两种使用形式
1 | func main() { |
多返回值
1 | func test() (int,int) { //(参数)(返回值) |
defer
保证语句在函数返回时执行
1 | func test() (int,int) { |