打包和工具链-《Go In Action》-Ch3

打包和工具链-《Go In Action》-Ch3

3.1 包

对于所有的.go文件,都应该在首行声明自己所属的包,每个包在一个单独的目录中,不能把多个包放在一个目录中,也不能把相同的包拆分到不同的目,同一个包下的所有
.go文件必须声明同一个包名

包命名惯例,简洁,顾名思义

main包是特殊的包,编译程序会将带有main包声明的包编译为二进制可执行文件,main包中一定要有main函数,否则不可以创建可执行文件

3.2 导入

导入包查找顺序 GOROOT -》 GOPATH,一旦编译器找到一个满足的包就会停止查找,也可以远程导入包,通过go get 将GitHub的包下载到本地

1
2
3
4
5
import (
"fmt"
"strings"
"github.com/spf13/viper"
)

如果包重名,可以使用命名导入,将导入的包命名为新名字

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
myfmt "mylib/fmt"
)

func main() {
fmt.Println("Standard Library")
myfmt.Println("mylib/fmt")
}

如果导入了不在代码使用的包,会导致编译失败,可以使用下划线来重命名不适用的包

3.3 函数init

每个包可以包含任意多个init函数,在main之前被调用,init函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作,可以使用下划线来重命名不适用的包
以数据库驱动为例,sql包在编译时并不知道要注册哪些驱动,如果我们要使用数据库连接,就需要用init函数将驱动注册到mysql上

1
2
3
4
5
6
7
8
9
package postgres

import (
"database/sql"
)

func init() {
sql.Register("postgres", new(PostgresDriver))
}

在使用这个新的数据库驱动时,需要使用空白标识符导入包

1
2
3
4
5
6
7
8
9
10
package main

import (
"database/sql"
_ "github.com/goinaction/code/chapter3/dbdriver/postgres"
)

func main() {
sql.Open("postgres", "mydb")
}

3.4 使用Go的工具

go build 执行编译
参数为空时 默认编译当前目录
参数可以为文件名
参数可以为/… 会编译目录下的所有包

go clean 执行清理,会删除可执行文件
go run 先构建再执行

3.5 进一步介绍Go开发工具

go vet 检测代码常见错误 printf类型匹配错误参数 方法签名错误 错误的结构标签 没有指定字段名的结构字面量
go fmt 格式化代码
go doc 打印文档
godoc 浏览器打开文档 godoc -http:6000

3.7 依赖管理

没有实际管理过一个大工程,这里看的稀里糊涂的,暂时不表了,等搞清楚再补

3.8 小结

Go语言中包是组织代码的基本单位
环境变量GOPATH决定了GO源代码在磁盘上被保存、编译和安装的位置
可以为每个工程设置不同的GOPATH,以保持源代码和依赖的隔离
go工具是在命令行上工作的最好工具
开发人员可以使用go get获取别人的包并将其安装到自己的GOPATH指定的目录
想要为别人创建包很见到,只要把源代码放到共有代码库,把那个遵守一些简单的规则就可以了
GO语言在设计时将分享代码作为语言的核心特性和驱动力
推荐使用依赖管理工具来管理依赖
有很多社区开发的依赖管理工具,godep、vendor、gb

# Golang

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×