go语言实战第二章读书笔记

包名

​ 每个文件都必须一个包里面,通常来说包名和文件夹名相同,也就意味着一个文件夹下面的所有文件的包名必须相同的。

​ 例如有以下目录结构

1
2
3
4
5
6
7
8
9
10
11
sample
├── data
│   └── data.json
├── main.go
├── matchers
│   └── rss.go
└── search
├── default.go
├── feed.go
├── match.go
└── search.go

那么以search文件夹为例,文件夹中的文件的包名都应该如下

1
package search

Main包

​ main函数会在main包里面出现,同理,main函数是go语言程序的入口地点。但是go语言包中还有另一个函数init()函数,init函数用于初始化整个包,因此假如main包中有init函数,也会先执行init(所有使用到的包中的init,顺序是导入包,初始化包,本包,并非只是main的init)函数在执行main函数。

​ 假如main包中没有main函数,那么构建出来的文件将会以库文件的形式存在,即不会生成可执行文件。

import

​ 用于导入需要的包,假如需要导入的包很多,可以以以下形式导入包

1
2
3
4
5
import 
(
"packgename1"
"packgename2"
)

​ 由于go语言不允许导入某个包而不使用,但是我们需要初始化某个包时但又不去使用它,那么应该在导入包名时在其前面加入_,使得go语言编译器接受这个包。例如我们想初始化matchers包。可以使用如下方法

1
2
3
4
5
6
7
import (
"fmt"
"log"
_ "main/sample/matchers" // 会调用包中的init()
"main/sample/search"
"os"
)

标准库

​ 每个代码文件都以 package 关键字开头,随后跟着包的名字。文件夹 search 下的每个代码文件都使用 search 作为包名。例如”fmt”,”log”。与第三方包不同,从标准库中导入代码时,只需要给出要导入的包名。编译器查找包的时候,总是会到 GOROOT 和 GOPATH 环境变量。

1
2
GOROOT="/User/username/go"
GOPATH="/User/username/spaces/go/projects"

作用域

​ 在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
2
3
4
5
6
for i,it := range arr { // i为下标,it为copy value

}
for _,it := range arr {

}

我们可以使用_下划线来表示此变量我们忽略,不需要使用,此时编译不会因为该变量未使用而报错。

闭包

​ go语言支持闭包,也支持匿名闭包,由于声明函数使用func关键字,执行时只需要配合()即可,因此有了如下两种使用形式

1
2
3
4
5
6
7
8
9
func main() {
func () {
print("闭包1")
}()//直接执行
f := func() { //声明
print("闭包2")
}
f()//调用
}

多返回值

1
2
3
4
func test() (int,int) { //(参数)(返回值)
a,b:=1,2
return a,b
}

defer

保证语句在函数返回时执行

1
2
3
4
5
6
7
func test() (int,int) {
defer fmt.Println("defer") // 最后执行
fmt.Println("start")
a,b:=1,2
return a,b
}