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 main
import {
"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