首頁 >後端開發 >Golang >如何在Go中正確實作隱藏介面方法?

如何在Go中正確實作隱藏介面方法?

Barbara Streisand
Barbara Streisand原創
2024-11-30 02:21:09397瀏覽

How to Properly Implement Hidden Interface Methods in 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會計系統套件中的方法。

cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter:
accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method)
have accountingsystem.getInvoice() error
want accounting.getInvoice() error

匿名結構體欄位方法

一個可能的解決方案是使用匿名結構體欄位。雖然這允許accountingsystem.Adapter滿足accounting.IAdapter接口,但它阻止使用者提供自己的未匯出方法的實作。

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{})
}

透過這種方式,accountingsystem.adapter類型對主程式是隱藏的,並且可以透過呼叫SetupAdapter函數來初始化accounting系統。

以上是如何在Go中正確實作隱藏介面方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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