首頁 > 後端開發 > Golang > Go介面可以跨套件使用未匯出的方法來實作嗎?

Go介面可以跨套件使用未匯出的方法來實作嗎?

DDD
發布: 2024-11-27 21:27:09
原創
631 人瀏覽過

Can Go Interfaces Be Implemented with Unexported Methods Across Packages?

跨套件使用未匯出方法實作介面

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

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