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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 06:18:10140ブラウズ

Can Go Interfaces Be Implemented with Unexported Methods in Different Packages?

Go でエクスポートされていないメソッドを使用したインターフェイスを実装する

特定の実装の詳細を隠しながら、会計システム アクセス用のインターフェイスを定義したい状況を考えてみましょう。 。インターフェイス メソッドをエクスポートしないようにし、ローカル アダプターから同じ関数を呼び出すエクスポートされた関数を基本パッケージで提供する予定です。ただし、メソッドのエクスポートされていない実装により、コンパイラはエラーを発生させます。

エクスポートされていないメソッドを含むインターフェイスを別のパッケージに実装することは可能ですか?

回答:

考えられる解決策の 1 つは、匿名構造体を利用することです。フィールド:

type Adapter struct {
    accounting.IAdapter
}

ただし、このアプローチでは、エクスポートされていないメソッドの独自の実装を提供できないことに注意することが重要です。つまり、Adapter.

の IAdapter.getInvoice() の実装をオーバーライドすることはできません。

別のアプローチ:

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

他のパッケージからaccountingsystem.Adapter タイプを隠す場合は、必要に応じて、タイプをアンエクスポートにし、アダプターをアカウンティングに登録するための関数を作成します。 package:

このアプローチでは、エクスポートされていないアダプター タイプをアカウンティング パッケージ内でラップし、他のパッケージへのアクセスを効果的に制限することで問題に対処します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。