首頁 >後端開發 >Golang >不同套件中未匯出的方法可以實作Go介面嗎?

不同套件中未匯出的方法可以實作Go介面嗎?

Susan Sarandon
Susan Sarandon原創
2024-12-10 06:18:10140瀏覽

Can Go Interfaces Be Implemented with Unexported Methods in Different Packages?

在Go 中使用未導出方法實現接口

考慮一種情況,您希望定義一個用於會計系統訪問的接口,同時隱藏特定的實作細節。您打算使介面方法不導出,並在基礎包中提供導出函數,以從本機適配器呼叫相同的函數。但是,由於方法的未導出實現,編譯器會引發錯誤。

在不同的套件中實作具有未導出方法的介面是否可行?

答案:

一種潛在的解決方案是利用匿名結構fields:

type Adapter struct {
    accounting.IAdapter
}

但是,必須注意的是,此方法不允許提供您自己的未匯出方法的實作。換句話說,您不能覆寫 Adapter 中 IAdapter.getInvoice() 的實作。

替代方法:

如果從其他包中隱藏accountingsystem.Adapter類型是如果需要,請取消匯出類型並建立一個用於向記帳註冊適配器的函數package:

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn