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

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

如何導入特定于平臺的結構?

如何導入特定于平臺的結構?

Go
慕的地8271018 2021-11-15 20:58:35
我在以這一行開頭的文件中有一個結構:// +build windows因此,它只能在 Windows 上構建。但是,初始化所有內容的應用程序部分需要檢查它是否在 Windows 上運行,如果是,則創建該結構的實例。我不知道如何在不破壞其他平臺上的東西的情況下做到這一點。例如,如果文件包含一個函數newWindowsSpecificThing()并且我在 Linux 上編譯,則該函數將不存在,因為它是在未編譯的文件中定義的。(當然,這會產生錯誤。)我如何解決這個困境?
查看完整描述

2 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

我認為您的解決方案是在您的結構上使用一些方法,該方法可在所有平臺上使用。查看dir_*.go文件如何為os包工作。該func (file *File) readdirnames(n int) (names []string, err error)由提供它是適用于所有平臺dir_plan9.go,dir_unix.godir_windows.go

對于您的問題,我會采用相同的方法,但使用一些可以進行內部工作的通用方法。在您的應用程序邏輯中,您將調用該函數,而在您的file_unix.go文件中,您將定義該函數不執行任何操作(空體)。


查看完整回答
反對 回復 2021-11-15
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

在某個地方,您顯然有一個調用newWindowsSpecificThing(). 那應該在特定于 Windows 的文件中。如果是,那么它不可用也沒有關系。你有一些東西“檢查它是否在 Windows 上運行”這一事實暗示了if runtime.GOOS == "windows"某處的聲明。而不是擁有它,而是將整個移動if到一個在 Windows 特定文件中定義的函數中。您還需要在!windows文件中定義該函數,這很好。


作為我的代碼示例,我有一個函數:


func Setup() *config {

    var cfg *config

    // setup portable parts of cfg

    return PlatformSpecificSetup(cfg)

}

然后我標記// +build windows了PlatformSpecificSetup()一個定義一種方式的文件,以及另一個// +build !windows定義另一種方式的標記。我從不需要檢查runtime.GOOS,也不需要處理未定義的數據類型。該config結構本身是在這些文件中定義的,所以它可以為每個平臺不同領域(只要他們同意足夠Setup())。如果我更加小心,我可以創建一個結構,如:


type config struct {

  // independent stuff

  plat *platformConfig

}

然后只是platformConfig在每個平臺文件中定義,但在實踐中我發現這比它值得的麻煩更多。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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