go tool简介
go build
- -o 指定编译输出的文件(默认与目录同名)可以带路径 go build -o a/b/c
- -a 强制重新编译所有包(含标准库)
- -p 指定可以并行可运行的编译数目,默认是CPU数目
- -v 打印正在编译的包名
- -n 仅显示编译命令,但是不执行
- -x 显示正在执行的命名
- -work 显示临时工作目录,完成后不删除
- -race 开启编译的时候自动检测数据竞争的情况,目前只支持64位机器
- -gcflags 编译器参数
- -ldflags 链接器参数
gcflags
- -B 禁用越界检查
- -N 禁用优化
- -l 禁用内联
- -u 禁用unsafe
- -S 输出汇编代码
- -m 输出优化信息
ldflags
- -s 禁用符号表
- -w 禁用DRAWF调试信息
- -X 设置字符串全局变量值 -X ver="0.99"
- -H 这只可执行文件格式 -H windowsgui
go install
和build参数相同,但是会将编译结果安装到bin,pkg目录。关键是go install支持增量编译,在没有修改的情况下,会直接链接pkg目录中的静态包
编译器用builddid检查文件清单和导入依赖,对比现有静态库和所有源文件修改时间来判断源码是否变化,以此来决定是否需要对包进行重新编译
buildid:将包的全部文件名,运行时版本号,所有导入的第三方包信息(路径buildid)数据合并后哈希
go get
将第三方包下载到GOPATH列表的第一个工作空间,默认不会检查更新,须使用 -u 参数
- -d 仅下载,不安装
- -u 更新包,包括其依赖项
- -f 和-u配合,强制更新,不检查是否过期
- -t 下载测试嗲啊所需的依赖包
- -insecure 使用http 等非安全协议
- -v 输出详细信息
- -x 显示正在执行的命名
go clean
清理工作目录
- -i 清理go install安装的文件
- -r 递归清理所有依赖包
- -x 显示正在执行的清理命令
- -n 仅显示清理命令,但不执行
交叉编译(交叉编译不支持CGO)
指在一个平台下编译出其他平台所需的可执行文件
GOOS=linux go build
GOOS=windows GOARCH=386 go build
建议使用go install 命令为目标平台预编译好标准库,避免go build每次都须完整编译
GOOS=linux go install std
GOOS=linux go install cmd
条件编译
除在代码中用runtime.GOOS 进行判断外,编译器本身就支持文件级别的条件编译。
方法一. 将平台和架构信息添加到文件名尾部
eg:hello_drawin.go hello_linux.go
方法二. 使用build编译指令
eg
// build windows
// build linux darwin
可以添加多条build,表示多个AND条件,在单一指令里,空格表示OR条件,逗号表示AND 感叹号表示NOT
// build linux darwin
// build 386,!cgo
相当于 (linux or darwin)AND (386 AND (NOT cgo))
方法三. 使用tag指令
// build !release
go build -tags "release " && ./test
预处理
用go generate 命令扫描源码文件,找出所有 go:generate 注释,提取其中的命令并执行
- 命令必须放在.go 源文件中
- 命令必须以 "//go:generate" 开头 双斜线后不能有空格
- 每个文件可有多条generate命令
- 命令支持环境变量
- 必须显示执行go generate命令
- 按文件名顺序提取命令并执行
- 串行执行,出错后终止后续命令的执行
参考资料
https://leokongwq.github.io/2016/10/15/golang-cross-compile.htmlleokongwq.github.io
您可能感兴趣的文章: