Go语言中的打包和工具链

所有Go语言的程序都会组织成若干组文件,每组文件被称为一个包。这样每个包的代码都可以作为很小的复用单元,被其他项目引用。

包名惯例

给包命名的惯例是使用包所在目录的名字。并不需要所有包的名字都与别的包不同,因为导入包时是使用全路径的,所以可以区分同名的不同包。

main包

Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。所有用Go语言编译的可执行程序都必须有一个名为main的包。


命令和包 Go文档里经常使用命令(command)这个词来指代可执行程序,如命令行应用程序。这会让新手在阅读文档时产生困惑。记住,在Go语言里,命令是指任何可执行程序。作为对比,包更常用来指语义上可导入的功能单元。


导入

import语句告诉编译器到磁盘的哪里去找想要导入的包。导入包需要使用关键字import,它会告诉编译器你想引用该位置的包内的代码。如果需要导入多个包,习惯上是将import语句包装在一个导入块中:

import ( "fmt" "net/http" "github.com/PuerkitoBio/goquery" "strconv")

标准库中的包会在安装Go的位置找到。Go开发者创建的包会在GOPATH环境变量指定的目录里查找。

远程导入

目前的大趋势是,使用分布式版本控制系统(DVCS)来分析代码,如GitHub。Go语言的工具链本身就支持从这些网站及类似网站获取源代码。Go工具链会使用导入路径确定需要获取的代码在网络的什么地方。
例如:

import "github.com/PuerkitoBio/goquery"

如果路径包含URL,可以使用Go工具链从DVCS获取包,并把包的源代码保存在GOPATH指向的路径里与URL匹配的目录里。这个获取过程使用go get命令完成。go get将获取任意指定的URL的包,或者一个已经导入的包所依赖的其他包。

命名导入

崇明的包可以通过命名导入来导入。命名导入时指,在import语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。
例如:

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

当你导入了一个不在代码里使用的包时,Go编译器会编译失败,并输出一个错误。
有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。在这种情况下,可以使用空白标识符_来重命名这个导入。


空白标识符 下划线字符(_)在Go语言里称为空白标识符,有很多用法。这个标识符用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。


函数init

每个包可以包含任意多个init函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的init函数都会安排在main函数之前执行。init函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。

使用Go的工具

go

go build编译程序。
go clean删除编译生成的可执行文件。
go run会先构建.go文件里包含的程序,然后执行构建后的程序。

进一步介绍Go开发工具

go vet

vet命令会帮开发人员检测代码的常见错误。

Go代码格式化

fmt命令自动格式化开发人员指定的源代码文件并保存。

Go语言的文档

go doc