第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 Go 中封裝平臺特定代碼的正確方法是什么?

在 Go 中封裝平臺特定代碼的正確方法是什么?

Go
阿晨1998 2021-12-13 18:38:18
我想開發(fā)一個小的 Go 應用程序,它向演示文稿的觀眾顯示使用的按鍵快捷方式。要掛鉤鍵盤事件,我將不得不使用一些特定于平臺的代碼。封裝平臺特定代碼的 Go 方式是什么?我一直在搜索諸如編譯器開關或平臺模塊之類的關鍵字,但我無法真正找到相關信息。
查看完整描述

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將在任何地方編譯(只需確保在給定平臺上調用正確的方法?。?。


查看完整回答
反對 回復 2021-12-13
?
達令說

TA貢獻1821條經驗 獲得超6個贊

平臺特定代碼的解決方案是構建約束。

注意:在 Go 1.17 之前,語法是以 開頭的注釋行// +build,但 Go 1.17 引入了//go:buildpragma 現在是首選方式。

構建約束,也稱為構建標記,是一行注釋,以

//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 的情況下構建代碼,則您可能不會出現一堆編譯器錯誤。


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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