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