2 回答
TA貢獻(xiàn)1853條經(jīng)驗 獲得超6個贊
雖然@icza 的答案絕對是 OP 關(guān)于條件編譯問題的正確權(quán)威答案,但在這種特定情況下,更簡單的方法可能是值得的。
Go 是一種旨在在每個平臺上編譯相同(使用相同編譯器)的語言,以鼓勵跨平臺代碼和庫重用。Go 不是 C/C++,因此必須花費時間來編寫明確的跨平臺代碼。
當(dāng)然,平臺不可知性僅適用于 Go 的運行時,并且您正在嘗試捕獲按鍵,為此沒有真正的單一平臺不可知的解決方案。
因此,我對這個用例的更簡單的建議類似于以下內(nèi)容:
package main
import (
"runtime"
kp "kplib"
)
func main () {
switch runtime.GOOS {
case "windows":
kp.WinKey()
case "darwin":
kp.MacKey()
case "linux":
kp.UnixKey()
default:
kp.TryKey()
}
}
有了隱含的保證,假設(shè)kplib將在任何地方編譯(只需確保在給定平臺上調(diào)用正確的方法?。?。
TA貢獻(xiàn)1821條經(jīng)驗 獲得超6個贊
平臺特定代碼的解決方案是構(gòu)建約束。
注意:在 Go 1.17 之前,語法是以 開頭的注釋行// +build,但 Go 1.17 引入了//go:buildpragma 現(xiàn)在是首選方式。
構(gòu)建約束,也稱為構(gòu)建標(biāo)記,是一行注釋,以
//go:build它列出了文件應(yīng)包含在包中的條件。約束可以出現(xiàn)在任何類型的源文件中(不僅僅是 Go),但它們必須出現(xiàn)在文件頂部附近,前面只能有空行和其他行注釋。這些規(guī)則意味著在 Go 文件中,構(gòu)建約束必須出現(xiàn)在 package 子句之前。
所以基本上每個平臺特定的 Go 代碼應(yīng)該放在不同的文件中,你可以用它們的目標(biāo)來標(biāo)記每個 Go 文件。
例如,如果文件包含 Linux 特定代碼(例如系統(tǒng)調(diào)用),請以以下方式啟動它:
//go:build linux
如果文件包含特定于 Windows 的系統(tǒng)調(diào)用,請使用以下命令啟動它:
//go:build windows
有更多“選項”可用,請閱讀鏈接的文檔。例如,您可以指定對操作系統(tǒng)、架構(gòu)、Go 版本、正在使用的編譯器的約束。您還可以指定多個約束,這些約束將使用邏輯 OR 或 AND 進(jìn)行解釋,或者您可以使用否定(例如,此代碼適用于除 linux 之外的每個目標(biāo)平臺)。
您甚至.go可以使用以下約束標(biāo)記要忽略的文件:
//go:build ignore
請注意,構(gòu)建約束是特定于編譯器的。如果特定編譯器無法識別構(gòu)建約束,則編譯器將忽略該文件。例如,Go AppEngine SDK 帶有一個內(nèi)置的、經(jīng)過修改的 Go 編譯器,它額外識別
//go:build appengine
約束,這意味著源文件僅適用于 Google App Engine 平臺?!俺R?guī)”Go 編譯器將忽略該文件,如果有人嘗試在沒有 Go AppEngine SDK 的情況下構(gòu)建代碼,則您可能不會出現(xiàn)一堆編譯器錯誤。
- 2 回答
- 0 關(guān)注
- 236 瀏覽
添加回答
舉報
