2 回答

TA貢獻1818條經驗 獲得超11個贊
構建約束,也稱為構建標記,是一行注釋,以
// +build
它列出了文件應包含在包中的條件。約束可以出現在任何類型的源文件中(不僅僅是 Go),但它們必須出現在文件頂部附近,前面只能有空行和其他行注釋。這些規則意味著在 Go 文件中,構建約束必須出現在 package 子句之前。
為了將構建約束與包文檔區分開來,一系列構建約束后必須跟一個空行。
構建約束被評估為空格分隔選項的 OR;每個選項都計算為其逗號分隔項的 AND;并且每個術語都是一個字母數字單詞,或者在前面加上 !,它的否定。也就是說,構建約束:
// +build linux,386 darwin,!cgo
對應于布爾公式:
(linux AND 386) OR (darwin AND (NOT cgo))
一個文件可能有多個構建約束??傮w約束是各個約束的 AND。也就是說,構建約束:
// +build linux darwin// +build 386
對應于布爾公式:
(linux OR darwin) AND 386
在特定構建期間,滿足以下條件:
- the target operating system, as spelled by runtime.GOOS
- the target architecture, as spelled by runtime.GOARCH
- the compiler being used, either "gc" or "gccgo"
- "cgo", if ctxt.CgoEnabled is true
- "go1.1", from Go version 1.1 onward
- "go1.2", from Go version 1.2 onward
- "go1.3", from Go version 1.3 onward
- "go1.4", from Go version 1.4 onward
- "go1.5", from Go version 1.5 onward
- "go1.6", from Go version 1.6 onward
- any additional words listed in ctxt.BuildTags
如果文件名在去除擴展名和可能的 _test 后綴后與以下任何模式匹配:
*_GOOS
*_GOARCH
*_GOOS_GOARCH
(例如:source_windows_amd64.go)其中 GOOS 和 GOARCH 分別代表任何已知的操作系統和架構值,然后該文件被認為具有需要這些術語的隱式構建約束(除了文件中的任何顯式約束)。
要防止文件被考慮用于構建:
// +build ignore
(任何其他不滿意的詞也可以使用,但“忽略”是約定俗成的。)
僅在使用 cgo 并且僅在 Linux 和 OS X 上構建文件:
// +build linux,cgo darwin,cgo
這樣的文件通常與為其他系統實現默認功能的另一個文件配對,在這種情況下,它將帶有約束:
// +build !linux,!darwin !cgo
命名文件 dns_windows.go 將使其僅在為 Windows 構建包時被包含;類似地,只有在為 32 位 x86 構建包時才會包含 math_386.s。
除了 android 標簽和文件之外,使用 GOOS=android 與 GOOS=linux 一樣匹配構建標簽和文件。
使用構建約束。
使用包含多個文件的單個包。每個文件專門用于特定的操作系統、體系結構等組合。

TA貢獻2019條經驗 獲得超9個贊
構建約束被評估為空格分隔選項的 OR;每個選項都計算為其逗號分隔項的 AND;每個術語都是一個字母數字單詞,或者,前面有 !
實際上,這將隨著 Go 1.17(2021 年第三季度)而改變
//go:build
線該
go
命令現在可以理解//go:build
行并且比// +build
行更喜歡它們。新語法使用布爾表達式,就像 Go 一樣,應該不太容易出錯。
在此版本中,新語法得到完全支持,所有 Go 文件都應更新為具有相同含義的兩種形式。
為了幫助遷移,gofmt
現在自動同步兩個表單。
有關語法和遷移計劃的更多詳細信息,請參閱https://golang.org/design/draft-gobuild。
從設計文件:
設計的核心思想是用使用更熟悉的布爾表達式的
// +build
新//go:build
行替換構建標記選擇的當前行。例如,舊語法
// +build linux // +build 386將被新語法取代
//go:build linux && 386
- 2 回答
- 0 關注
- 142 瀏覽
添加回答
舉報