内置命令
Go 工具链
我们也可以使用

go build
这个命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。
-
如果是普通包,就像我们在
1.2 节中编写的mymath 包那样,当你执行go build 之后,它不会产生任何文件。如果你需要在$GOPATH/pkg
下生成相应的文件,那就得执行go install 。 -
如果是
main 包,当你执行go build 之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin 下生成相应的文件,需要执行go install ,或者使用go build -o 路径/a.exe 。 -
如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在
go build 之后加上文件名,例如go build a.go ;go build 命令默认会编译当前目录下的所有go 文件。 -
你也可以指定编译输出的文件名。例如
1.2 节中的mathapp 应用,我们可以指定go build -o astaxie.exe ,默认情况是你的package 名( 非main 包) ,或者是第一个源文件的文件名(main 包) 。
-
go build 会忽略目录下以 “_”或“.” 开头的go 文件。 -
如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。例如有一个读取数组的程序,它对于不同的操作系统可能有如下几个源文件:
array_linux.goarray_darwin.goarray_windows.goarray_freebsd.go
参数的介绍
-o 指定输出的文件名,可以带上路径,例如go build -o a/b/c -i 安装相应的包,编译+go install -a 更新全部已经是最新的包的,但是对标准包不适用-n 把需要执行的编译命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的-p n 指定可以并行可运行的编译数目,默认是CPU 数目-race 开启编译的时候自动检测数据竞争的情况,目前只支持64 位的机器-v 打印出来我们正在编译的包名-work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除-x 打印出来执行的命令,其实就是和-n 的结果类似,只是这个会执行- -ccflags ‘arg list’ 传递参数给
5c, 6c, 8c 调用 -compiler name 指定相应的编译器,gccgo 还是gc - -gccgoflags ‘arg list’ 传递参数给
gccgo 编译连接调用 - -gcflags ‘arg list’ 传递参数给
5g, 6g, 8g 调用 -installsuffix suffix 为了和默认的安装包区别开来,采用这个前缀来重新安装那些依赖的包,-race 的时候默认已经是-installsuffix race, 大家可以通过-n 命令来验证- -ldflags ‘flag list’ 传递参数给
5l, 6l, 8l 调用 - -tags ’tag list’ 设置在编译的时候可以适配的那些
tag ,详细的tag 限制参考里面的 Build Constraints
混合编译
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello\n")
}
$ GOOS=windows GOARCH=386 go build -o hello.exe hello.go
# 安装 windows-amd64 标准库
# GOOS=windows GOARCH=amd64 go install
$ env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app
我们也可以使用
docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c '
for GOOS in darwin linux windows; do
for GOARCH in 386 amd64; do
echo "Building $GOOS-$GOARCH"
export GOOS=$GOOS
export GOARCH=$GOARCH
go build -o bin/ironcli-$GOOS-$GOARCH
done
done
'
go clean
这个命令是用来移除当前源码包和关联源码包里面编译生成的文件。这些文件包括:
_obj/
旧的object 目录,由Makefiles 遗留_test/
旧的test 目录,由Makefiles 遗留_testmain.go
旧的gotest 文件,由Makefiles 遗留test.out
旧的test 记录,由Makefiles 遗留build.out
旧的test 记录,由Makefiles 遗留*.[568ao]object
文件,由Makefiles 遗留
*.so
由
$ go clean -i -n
cd /Users/astaxie/develop/gopath/src/mathapp
rm -f mathapp mathapp.exe mathapp.test mathapp.test.exe app app.exe
rm -f /Users/astaxie/develop/gopath/bin/mathapp
参数介绍
-i 清除关联的安装的包和可运行文件,也就是通过go install 安装的文件-n 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的-r 循环的清除在import 中引入的包-x 打印出来执行的详细命令,其实就是-n 打印的执行版本
go fmt
有过
使用
所以
-l 显示那些需要格式化的文件-w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。-r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换-s 简化文件中的代码-d 显示格式化前后的diff 而不是写入文件,默认是false -e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10 个错误。-cpuprofile 支持调试模式,写入相应的cpufile 到指定的文件
go get
这个命令是用来动态获取远程代码包的,目前支持的有
BitBucket (Mercurial Git) GitHub (Git) Google Code Project Hosting (Git, Mercurial, Subversion) Launchpad (Bazaar)
所以为了
参数介绍:
-d 只下载不安装-f 只有在你包含了-u 参数的时候才有效,不让-u 去验证import 中的每一个都已经获取了,这对于本地fork 的包特别有用-fix 在获取源码之后先运行fix ,然后再去做其他的事情-t 同时也下载需要为运行测试所需要的包-u 强制使用网络去更新包和它的依赖包-v 显示执行的命令
go install
这个命令在内部实际上分成了两步操作:第一步是生成结果文件
参数支持
go test
执行这个命令,会自动读取源码目录下面名为
ok archive/tar 0.011s FAIL archive/zip 0.022s ok compress/gzip 0.033s …
默认的情况下,不需要任何的参数,它会自动把你源码包下面所有
这里我介绍几个我们常用的参数:
-bench regexp 执行相应的benchmarks ,例如-bench=. -cover 开启测试覆盖率-run regexp 只运行regexp 匹配的函数,例如-run=Array 那么就执行包含有Array 开头的函数-v 显示测试的详细命令
go tool
go tool fix . 用来修复以前老版本的代码到新版本,例如go1 之前老版本的代码转化到go1, 例如API 的变化go tool vet directory|files 用来分析当前目录的代码是否都是正确的代码, 例如是不是调用fmt.Printf 里面的参数不正确,例如函数里面提前return 了然后出现了无用代码之类的。
go generate
这个命令是从
这里我们来举一个简单的例子,例如我们经常会使用
go tool yacc -o gopher.go -p parser gopher.y
//go:generate go tool yacc -o gopher.go -p parser gopher.y
这里我们注意了,
所以我们可以通过如下的命令来生成,编译,测试。如果
$ go generate
$ go build
$ go test
godoc
在
很多人说
如何查看相应
通过命令在命令行执行
其它命令
以上这些工具还有很多参数没有一一介绍,用户可以使用