ホームページ > バックエンド開発 > Golang > Go インターフェイスは、パッケージ全体でエクスポートされていないメソッドを使用して実装できますか?

Go インターフェイスは、パッケージ全体でエクスポートされていないメソッドを使用して実装できますか?

DDD
リリース: 2024-11-27 21:27:09
オリジナル
629 人が閲覧しました

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}
ログイン後にコピー

残念ながら、accountingsystem パッケージからエクスポートされていない getInvoice() メソッドが表示されないため、このアプローチではコンパイル エラーが発生します。

代替アプローチ

匿名構造体フィールド:

1 つの解決策は、インターフェースのパッケージ内の匿名構造体フィールド。これにより、実装を公開せずにインターフェイスを満たすことができます:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート