打包和工具链(Go Tutorial)
3.1 包
所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包。这样每个包的代码都可以作为很小的复用单元,被其他项目引用。
所有的 .go 文件,除了空行和注释,都应该在第一行声明自己所属的包。
同一目录下的所有 .go 文件必须声明为同一个包。不同包需放在不同的目录下。
3.1.1 包名惯例
- 包名应该使用目录名
- 包名需使用简洁、清晰且全小写的名字
- 并不需要所有包的名字都与别的包名不同,因为导入包时使用的是全路径,所以可区分同名的不同包
- 包导入后会使用默认的包名,但也可修改导入后的包名
3.1.2 main 包
在 Go 语言里,命名为 main
的包具有特殊的含义。Go 语言的编译承训会试图把这种名字为 main
的包编译为可执行文件。所有用 Go 语言编译的可执行程序都必须有一个名叫 main
的包。
如果 main
包里没有定义 main()
函数,那么程序就无法运行,也无法编译成可执行程序。
3.2 导入
import 语句会告诉编译器到磁盘的哪里去找想要导入的包。如果需要导入多个包,习惯上是将 import 语句包装在一个导入块中。
import (
"fmt"
"strings"
)
编译器会使用 Go 环境变量设置的路径,通过引入的相对路径来查找磁盘上的包。
- 标准库中的包会在安装 Go 的位置找到
- Go 开发者创建的包会在
GOPATH
环境变量指定的目录里查找
需要注意的是,一旦编译器找到了一个满足 import
语句指定的包,就会停止进一步查找。编译器首先会查找 Go 的安装目录,再依次查找 GOPATH
变量列出的目录。
如果没有找到需要的包,那么试图对程序进行 run
或 build
时,编译器会报错。后面可通过 go get
命令来修正这种错误。
3.2.1 远程导入
import "github.com/spf13/viper"
用导入路径编译程序时,go build
命令会使用 GOPATH
的设置,在磁盘上搜索这个包。如果路径包含 URL,可以使用 Go 工具链从 DVCS 获取包,并把包的源代码保存在 GOPATH
指向的路径里与 URL 匹配的目录里,这个过程使用 go get
命令完成。
go get
将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其他包。由于 go get
这种递归特性,这个命令会扫描某个包的源码树,获取所有能找到的依赖包。
3.2.2 命名导入
命名导入是解决包名冲突的有效方法,同时也可简化包名。
Go 语言导入包有以下几种方式:
// 使用 test.Test() import "test/test"
// 使用 mongo.Test() import mongo "mongo/db"
// 对包的调用省略包名,可以直接调用包中的方法或变量 import . "test/test"
// 当需要导入一个包,但是不需要引用这个包的标识符,使用空白标识符来替代 import _ "test/test"
3.3 函数 init
每个包可以包含任意多个 init
函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会被安排在 main 函数之前执行。
init 函数在设置包、初始化变量或者其他要在程序运行之前优先完成的引导工作。
package main
import (
"fmt"
"os"
"./test"
)
func init() {
fmt.Println("run before main")
}
func main() {
fmt.Println(os.Getenv("GOPATH"))
fmt.Println(test.Test())
}
3.4 使用 Go 工具
go build
:编译程序,生成可执行文件。
go build hello.go
:指定 Go 文件go build
:使用当前目录来编译go build test/...
:编译 test 目录下的所有包
go clean
:清除编译生成的可执行文件。
go run hello.go
:编译完后需要生成运行可执行文件,使用 go run
命令可以将 go build
和运行这两步合二为一。
3.5 进一步介绍 Go 开发工具
3.5.1 go vet
go vet main.go
命令会帮开发人员检测代码的常见错误
- Printf 类函数调用时,类型匹配错误的参数
- 定义常用的方法时,方法签名的错误
- 错误的结构标签
- 没有指定字段名的结构字面量
3.5.2 Go 代码格式化
go fmt main.go
用来格式化代码,可以用来在保存文件或提交代码库前执行 go fmt
3.5.3 Go 语言文档
go doc tar
:命令行查看 tar 包文档
godoc -http:=6060
:在线查看文档
3.7 依赖管理
gb 是一个由 Go 社区成员开发的全新构建工具,初步理解与 composer
类似