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

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

DDD
DDDオリジナル
2024-11-29 17:00:12289ブラウズ

How Can I Implement an Interface with Unexported Methods in a Different Go Package?

パッケージ全体でエクスポートされていないメソッドを持つインターフェイスを実装する

メソッドをエクスポートしないようにすることで、インターフェイスの実装の詳細へのアクセスを制限しようとしています。これは有効なアプローチではありますが、インターフェイスを別のパッケージに実装するときに課題が生じる可能性があります。

問題

コンパイラは、エクスポートされていないaccountingsystem.AdapterのgetInvoiceメソッド。これは、パッケージが独自のスコープ外でエクスポートされていない識別子を使用できないようにする Go 言語の可視性ルールによるものです。

考えられる解決策

残念ながら、直接的な方法はありません。別のパッケージ内のエクスポートされていないメソッドとのインターフェイスを実装します。ただし、同様の結果を達成する別の方法もあります。

匿名構造体フィールドの使用

別のパッケージの構造体内に匿名フィールドとしてインターフェイスを埋め込むことができます。これにより、構造体がインターフェイスを満たすことができますが、エクスポートされていないメソッドの独自の実装を定義することもできなくなります。

アダプターの登録

より適切なアプローチアダプター タイプを非エクスポートにし、それをメイン パッケージに登録する関数をアダプター パッケージ内に提供することです。これにより、柔軟性を維持しながらアダプターへのアクセスを制御できます。

// accountingsystem package
type adapter struct {}

// ... implementation omitted ...

func SetupAdapter() {
    accounting.SetAdapter(adapter{})
}

// main package
func main() {
    accountingsystem.SetupAdapter()
}

このメソッドを使用すると、インターフェースをパッケージ間で使用できるようにしながら、アダプターの実装へのアクセスを制限できます。

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

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