亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以根據我正在構建的操作系統導入 Golang 包嗎?

我可以根據我正在構建的操作系統導入 Golang 包嗎?

Go
胡說叔叔 2021-12-20 15:44:53
假設我有一個基于哪個操作系統的 go 項目,在某些情況下是哪個發行版,我想使用一個 Systemd 客戶端包 vs 一個 Upstart 客戶端包 vs 一個 sysv 客戶端包 vs 一個 launchd 客戶端包。是否可以有選擇地導入每個包,以便我只導入我正在構建的每個操作系統/發行版所需的包?還是我必須為每個操作系統/發行版導入每個包?
查看完整描述

2 回答

?
慕尼黑8549860

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 一樣匹配構建標簽和文件。


使用構建約束。


使用包含多個文件的單個包。每個文件專門用于特定的操作系統、體系結構等組合。


查看完整回答
反對 回復 2021-12-20
?
慕少森

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


查看完整回答
反對 回復 2021-12-20
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號