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