條件編譯:
標簽編譯:( build tag )
// +build { GOOS }, { GOOS }, { !GOOS }
// +build (linux AND 386) OR (darwin AND (NOT cgo))
以 + 開始,例如 // +build
支持 GOOS 與 GOARCH 並可以具有多個值,用 , 分割, 例如: // +build linux, darwin, freebsd
支持 不等條件 ! , 例如:\ +build !windows 即,不在windows環境下時,均可編譯此文件。
支持 與非 邏輯, AND OR NOT 。
條件編譯需要前後空一行,否則無法識別。
文件後綴:
xxx_{ GOOS }.go xxx_{ GOOS }_{ GOARCH }.go
支持 GOOS ,例如: curl_windows.go
支持 GOARCH, 例如: curl_386.go
支持 上述兩種疊加,但不可調換順序 xxx_{ GOOS }_{ GOARCH }.go ,例如: curl_windows_amd64.go
如何選擇:
這兩者可以疊加使用,但注意不要出現冗余,如:curl_windows.go 裡面寫 // +build windows 則重復了。
如果編譯的文件是一一對應關系的話,使用文件後綴更簡單些,如對每個 GOOS 生成一個文件。
如果有復雜條件的話,可以使用標簽編譯方式。如:
curl_windows.go 對應 windows 平台。
curl_others.go 裡面寫 \ +build !windows 對應 非windows 平台。
交叉編譯:
Golang 1.5 ( 以上 ) 修改 GOOS GOARCH 後,即可。如:
export GOOS=windows
go install curl.go
GOOS 與 GOARCH 支持的參數:
GOOS
編譯參數:
go get
-u - 強制使用網絡去更新包和它的依賴包。當不加 -u 時,如果本地以存在,則不再從遠程加載( 更新 ) 。
-d - 只下載不安裝。
-v - 與 go build 參數含義相同。
-x - 與 go build 參數含義相同。
特性:
使用 go get 時,會自動切換到與當前 go version 一樣的分支,如:當前 go version 是 1.5 則會自動查詢 tags/go1 or branch/go1
支持的版本控制系統:
Mercurial
Git
Subversion
Bazaar
go build
不包含 main() 的話,執行後,不會產生任何文件。如果想要生成 package 或 可執行文件 需要使用 go install 。
包含 main() 的話,執行後,會在當前目錄生成 package 或 可執行性文件
以 _ . 開頭的文件會被忽略,例如:_xxx.go 或者 .xxx.go
支持上面描述的 條件編譯 。
常用參數:
-o - 指定編譯的文件名,可以帶上路徑。如: go build -o aaa.exe
-a - 強行對所有涉及到的代碼包(包含標准庫中的代碼包)進行重新構建,即使它們已經是最新的了。
-n - 打印編譯期間所用到的其它命令,但是並不真正執行它們。
-v - 打印出那些被編譯的代碼包的名字。
-x - 打印編譯期間所用到的其它命令。
-work - 打印出編譯時生成的臨時工作目錄的路徑,並在編譯結束時保留它。在默認情況下,編譯結束時會刪除該目錄。
go install
支持絕大多數的 go builid 參數,在 go build 執行的基礎上,即:如果定義了 GOBIN 的話,會在此目錄下生成可執行文件。( 前提是需要包含 main() 方法 ), 而 go build 只會在當前文件夾下生成 可執行性文件 。
godoc
-http=: 指定端口。
go list
-json - 列出當前包的信息,包括依賴等, json 的基本字段含義:
go list -json 1
go list -json 2
-f - 查看某個具體的字段,例如: go list -f {{.Gofiles}} ,其中{{}} 屬於 text/template 語法。
go run
包含了兩個動作,編譯 + 運行。
與 go build | go install 一樣,支持它們的參數。
go test
-c - 生成用於運行測試的可執行文件,但不執行它。
-i - 安裝/重新安裝運行測試所需的依賴包但不編譯和運行測試代碼。
其它命令:
go version 查看go當前的版本
go env 查看當前go的環境變量
有用的參數:
-i - 安裝相應的包。編譯 +go install
-p n - 指定可以並行可運行的編譯數目,默認是CPU數目。
-race - 開啟編譯的時候自動檢測數據競爭的情況,目前只支持64位的機器。
參考:
https://golang.org/pkg/go/build/
https://golang.org/doc/install/source
http://studygolang.com/articles/154
https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/01.3.html