パッケージ全体でエクスポートされていないメソッドを持つインターフェイスを実装する
メソッドをエクスポートしないようにすることで、インターフェイスの実装の詳細へのアクセスを制限しようとしています。これは有効なアプローチではありますが、インターフェイスを別のパッケージに実装するときに課題が生じる可能性があります。
問題
コンパイラは、エクスポートされていない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 サイトの他の関連記事を参照してください。