跨套件使用未匯出方法實作介面
在 Go 中,實作介面通常需要定義與介面簽章相符的匯出方法。然而,在某些情況下,維持實現的可近性是不合需要的。本文探討了在單獨的套件中使用未匯出方法實現介面的可行性。
考慮以下程式碼片段,其中會計系統的實作(accountingsystem) 隱藏在未匯出類型中:
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() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
不幸的是,這種方法會產生編譯錯誤,因為會計系統包中未匯出的getInvoice()方法對會計不可見package.
替代方法
匿名結構欄位:
解決方案結構字段實作介面在介面的包內。這允許在不暴露實現的情況下滿足介面:
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
設定函數:
或者,您可以透過註冊建立單獨的函數來設定適配器未導出的類型作為適配器:
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中文網其他相關文章!