ホームページ > バックエンド開発 > Golang > 別の Go パッケージからエクスポートされていないメソッドを使用してインターフェイスを実装するにはどうすればよいですか?

別の Go パッケージからエクスポートされていないメソッドを使用してインターフェイスを実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-03 04:24:10
オリジナル
556 人が閲覧しました

How Can I Implement an Interface with Unexported Methods from Another Go Package?

他のパッケージからエクスポートされていないメソッドを使用したインターフェイスの実装

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 メソッドを表示できないというエラーを出します。

この問題は、Go でのインターフェイスの動作方法に起因します。インターフェイスはメソッド シグネチャのみで構成され、その実装についての知識はありません。型がインターフェイスを実装する場合、インターフェイスと同じシグネチャを持つすべてのメソッドを公開する必要があります。

この制限を克服するには、匿名の構造体フィールドを利用できます。

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

---

package main

func main() {
    accountingsystem.SetupAdapter()
}
ログイン後にコピー

このアプローチにより、適切な実装の登録を可能にしながらアダプターが確実に隠蔽されたままになります。

以上が別の Go パッケージからエクスポートされていないメソッドを使用してインターフェイスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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