golang 的编译仍是比较容易的,用法以下:html
go build [-o output] [-i] [build flags] [packages]
上面方括号标记的参数,均可以没有……git
最简的操做就是直接 go build
,这样操做会直接找到当前文件夹下的 main
包,并编译之。golang
比较经常使用的就是 -o
了,指定输出文件,好比:windows
go build -o 666 main.go
此时会将 main.go
编译为二进制文件666(windows下会输出成 666.exe
)bash
go 是支持交叉编译的,请参见 golang开发环境配置备忘ui
具体操做能够参考命令说明,在你的命令行输入 go help build
查看细节。命令行
我在这列举若干调试
go 编译出的文件,实话说体积挺大的。一个重要缘由是其中包含了调试信息,咱们能够经过编译参数使其不包含调试信息,这样输出的体积会小一些。code
# 移除 调试信息(-w) 和 符号表(-s) go build -o main -ldflags "-w -s" main.go
上述操做使用 -ldflags
参数指定 -w
和 -s
, 分别表示在编译时不包含调试信息和符号表,此举能够较好地缩减二进制文件体积。htm
go 能够经过编译参数,在编译时对变量进行赋值。通常状况下,这种操做可让程序保留编译信息等数据。
经过 -ldflags
参数,设定 -X
操做,能够为全局变量赋值。
试举一例:
源码以下
package main import "fmt" var BuildTime = "now" func main() { fmt.Printf("BuildTime: %s\n", BuildTime) }
定义全局变量BuildTime
并在主程序中输出。
$ go run main.go BuildTime: now $ go build -ldflags "-X 'main.BuildTime=time006'" main.go $ ./main BuildTime: time006 $ go build -ldflags "-X 'main.BuildTime=`date`'" main.go $ ./main BuildTime: Sun 29 Sep 2019 10:14:47 PM CST
上面分别演示了,直接运行源码,编译加参数运行的效果。第三个示例表示,使用 -X
对全局变量进行编译时赋值,甚至能够将命令结果赋予全局变量。
因此一般咱们会这么作:
package main import "fmt" var BuildTime = "" var GitHash = "" func main() { fmt.Printf("BuildTime: %s\n", BuildTime) fmt.Printf("Git Hash: %s\n", GitHash) }
分别定义 BuildTime
编译时间和 GitHash
git的commit hash。在合适的时候输出,以方便地区分版本。并使用以下编译命令:
go build -ldflags "-X 'main.BuildTime=`date`' -X 'main.GitHash=`git rev-parse HEAD`'" main.go
最后,编译后的程序会有相似以下输出:
$ ./main BuildTime: Sun 29 Sep 2019 10:29:36 PM CST Git Hash: 9a80ee05b16e0aa90e6e0b690c7da8686fd102a0
这样就能知道编译后的二进制文件版本是什么了。
其它内容,想到再补充。
原文发布于:https://moonlightwatch.me/%E5%BC%80%E5%8F%91%E9%9A%8F%E7%AC%94/27.html