2 回答

TA貢獻1853條經驗 獲得超6個贊
雖然@icza 的答案絕對是 OP 關于條件編譯問題的正確權威答案,但在這種特定情況下,更簡單的方法可能是值得的。
Go 是一種旨在在每個平臺上編譯相同(使用相同編譯器)的語言,以鼓勵跨平臺代碼和庫重用。Go 不是 C/C++,因此必須花費時間來編寫明確的跨平臺代碼。
當然,平臺不可知性僅適用于 Go 的運行時,并且您正在嘗試捕獲按鍵,為此沒有真正的單一平臺不可知的解決方案。
因此,我對這個用例的更簡單的建議類似于以下內容:
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()
}
}
有了隱含的保證,假設kplib將在任何地方編譯(只需確保在給定平臺上調用正確的方法?。?。

TA貢獻1821條經驗 獲得超6個贊
平臺特定代碼的解決方案是構建約束。
注意:在 Go 1.17 之前,語法是以 開頭的注釋行// +build
,但 Go 1.17 引入了//go:build
pragma 現在是首選方式。
構建約束,也稱為構建標記,是一行注釋,以
//go:build它列出了文件應包含在包中的條件。約束可以出現在任何類型的源文件中(不僅僅是 Go),但它們必須出現在文件頂部附近,前面只能有空行和其他行注釋。這些規(guī)則意味著在 Go 文件中,構建約束必須出現在 package 子句之前。
所以基本上每個平臺特定的 Go 代碼應該放在不同的文件中,你可以用它們的目標來標記每個 Go 文件。
例如,如果文件包含 Linux 特定代碼(例如系統(tǒng)調用),請以以下方式啟動它:
//go:build linux
如果文件包含特定于 Windows 的系統(tǒng)調用,請使用以下命令啟動它:
//go:build windows
有更多“選項”可用,請閱讀鏈接的文檔。例如,您可以指定對操作系統(tǒng)、架構、Go 版本、正在使用的編譯器的約束。您還可以指定多個約束,這些約束將使用邏輯 OR 或 AND 進行解釋,或者您可以使用否定(例如,此代碼適用于除 linux 之外的每個目標平臺)。
您甚至.go
可以使用以下約束標記要忽略的文件:
//go:build ignore
請注意,構建約束是特定于編譯器的。如果特定編譯器無法識別構建約束,則編譯器將忽略該文件。例如,Go AppEngine SDK 帶有一個內置的、經過修改的 Go 編譯器,它額外識別
//go:build appengine
約束,這意味著源文件僅適用于 Google App Engine 平臺?!俺R?guī)”Go 編譯器將忽略該文件,如果有人嘗試在沒有 Go AppEngine SDK 的情況下構建代碼,則您可能不會出現一堆編譯器錯誤。
- 2 回答
- 0 關注
- 213 瀏覽
添加回答
舉報