首頁 > 後端開發 > Golang > 如何使用另一個 Go 套件中未匯出的方法實作介面?

如何使用另一個 Go 套件中未匯出的方法實作介面?

Susan Sarandon
發布: 2024-12-03 04:24:10
原創
556 人瀏覽過

How Can I Implement an Interface with Unexported Methods from Another Go Package?

使用其他套件中未導出的方法實作介面

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板