使用其他套件中未導出的方法實作介面
在Go 中,介面充當契約,定義了一組必須由任何遵循它的類型。通常,導出介面的方法以允許從其他套件進行存取。但是,在某些情況下,您可能需要對使用程式隱藏特定的實作。
考慮以下範例,其中我們定義了用於會計系統存取的介面:
package accounting import "errors" type IAdapter interface { GetInvoice() error }
隱藏具體實現,我們不匯出介面方法,並在基礎包中引入包裝函數,這些函數透過適配器:
var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.GetInvoice() }
雖然這種方法看起來很有前途,但在嘗試在另一個套件中實作介面時遇到了問題。編譯器抱怨無法看到未匯出的 GetInvoice 方法。
這個問題源自於 Go 中介面的工作方式。介面僅由方法簽名組成,不了解其實作。當類型實作介面時,它必須公開與介面具有相同簽章的所有方法。
為了克服此限制,我們可以利用匿名結構體字段:
type Adapter struct { accounting.IAdapter }
這允許我們可以通過匿名嵌入的方式在另一個包中實現該接口,但我們無法為未匯出的方法提供自訂實作。
更慣用的方法解決方案是公開未匯出的適配器並在基礎包中提供註冊函數:
package accounting type IAdapter interface { GetInvoice() error } --- package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } --- package main func main() { accountingsystem.SetupAdapter() }
此方法可確保適配器保持隱藏狀態,同時仍允許註冊適當的實現。
以上是如何使用另一個 Go 套件中未匯出的方法實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!