如何編譯
golang 的編譯還是比較容易的,用法如下:
go build [-o output] [-i] [build flags] [packages]
上面方括號標記的參數,都可以沒有……
最簡的操作就是直接 go build
,這樣操作會直接找到當前文件夾下的 main
包,並編譯之。
比較常用的就是 -o
了,指定輸出文件,比如:
go build -o 666 main.go
此時會將 main.go
編譯為二進制文件666(windows下會輸出成 666.exe
)
go 是支持交叉編譯的,請參見 golang開發環境配置備忘
更多設置
具體操作可以參考命令說明,在你的命令行輸入 go help build
查看細節。
我在這列舉若干
縮小輸出文件體積
go 編譯出的文件,實話說體積挺大的。一個重要原因是其中包含了調試信息,我們可以通過編譯參數使其不包含調試信息,這樣輸出的體積會小一些。
# 移除 調試信息(-w) 和 符號表(-s)
go build -o main -ldflags "-w -s" main.go
上述操作使用 -ldflags
參數指定 -w
和 -s
, 分別表示在編譯時不包含調試信息和符號表,此舉可以較好地縮減二進制文件體積。
編譯時寫入全局變量
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