パッケージ間でエクスポートされていないメソッドを使用したインターフェイスの実装
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 サイトの他の関連記事を参照してください。