Go では、同じメソッド シグネチャを持つが別個のパッケージで定義されている複数のインターフェイスを処理する場合、次のような状況が発生することがあります。両方のインターフェイスを実装した型は、予期しない動作を引き起こします。
異なるパッケージで定義されている次の 2 つのインターフェイス (Doer) と関数 (FuncA と FuncB) について考えてみましょう。
<code class="go">// Package A type Doer interface { Do() string } func FuncA(doer Doer) // Package B type Doer interface { Do() string } func FuncB(doer Doer)</code>
型 C が Doer を実装している場合
<code class="go">// Package main type C int func (c C) Do() string { return "A-specific implementation" } func main() { cA := C(0); A.FuncA(cA) cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations }</code>
この問題に対処するために、Go の型システムは名前による一致と型の一貫性を重視しています。オブジェクトが複数のインターフェイスを満たすことは可能ですが、共有メソッドの実装は該当するすべてのインターフェイス規約に準拠する必要があります。
上記のシナリオでは、回避策としてラッパー タイプを実装する必要があります。
<code class="go">// Package main type DoerA struct { C C } func (d DoerA) Do() string { return "A-specific implementation" } type DoerB struct { C C } func (d DoerB) Do() string { return "B-specific implementation" } func main() { cA := DoerA{C(0)}; A.FuncA(cA) cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations }</code>
これらのラッパーを作成することで、意図したインターフェイスの使用法に基づいて Do() の実装を制御し、それぞれのパッケージ コンテキスト内での一貫性を確保できます。
以上がGo で異なるパッケージ間で同じメソッド シグネチャを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。