Go インターフェイスを使用する場合、インターフェイスの戻り型を宣言するインターフェイス メソッドが実装されるとエラーが発生する可能性があります具体的な種類によって。このエラーは、メソッドの実装がインターフェイスの型を直接返さず、インターフェイスを実装する具象型を返すために発生します。
次の例を考えてみましょう。
<code class="go">package main import "fmt" type Foo struct { val string } func (f *Foo) String() string { return f.val } type StringerGetter interface { GetStringer() fmt.Stringer } type Bar struct{} func (b *Bar) GetStringer() *Foo { return &Foo{"foo"} } func Printer(s StringerGetter) { fmt.Println(s.GetStringer()) } func main() { f := Bar{} Printer(&f) }</code>
ここでは、プリンター関数は StringerGetter インターフェイスを想定しており、このインターフェイスには fmt.Stringer を返す GetStringer メソッドがありますが、Bar 型の GetStringer メソッドは fmt.Stringer インターフェイスを実装する具象型 Foo を返します。これにより、次のエラーが発生します:
prog.go:29: cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method) had GetStringer() *Foo want GetStringer() fmt.Stringer
この問題の解決策は、インターフェイスのメソッドを予期されるインターフェイスの種類と一致させることにあります。この場合、GetStringer メソッドは具象型の代わりに fmt.Stringer を返す必要があります。
<code class="go">func (b *Bar) GetStringer() fmt.Stringer { return &Foo{"foo"} }</code>
または、次に示すように、必要なインターフェイスを実装し、具象型に委譲するラッパー型を作成することもできます。次の手法:
委任による型埋め込み:
<code class="go">type MyBar struct{ Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.Bar.GetStringer() }</code>
型ラッピング:
<code class="go">type MyBar Bar func (b *MyBar) GetStringer() fmt.Stringer { return &Foo{"foo"} }</code>
これらの手法具体的な型を直接変更することなく、シームレスにインターフェイスできるようになります。具体的な型をラップまたは埋め込むことで、必要なインターフェイス規約に準拠したカスタム型を作成できます。
以上が具象型の実装がインターフェイス メソッドで予期されるインターフェイス型ではなく具象型を返すと、Go がエラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。