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) // compile-time error }</code>
このコードでは、次のコンパイル時エラーが発生します:
cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method)
この問題を解決するには、Bar 型の GetStringer メソッドが fmt を返す必要があります。具象 *Foo 型の代わりに .Stringer インターフェイスを使用するか、インターフェイスの代わりに具象型を受け入れるように StringerGetter インターフェイスを変更する必要があります。
外部具象型を変更する場合または共有インターフェイスが望ましくない場合は、2 つの代替解決策があります:
<code class="go">type MyBar struct { Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.Bar.GetStringer() }</code>
<code class="go">type MyBar struct { embed Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.GetStringer() }</code>
どちらのアプローチでも、元の型や共有インターフェイスを変更せずに、目的のインターフェイス実装を提供しながら、外部の具象型を操作できます。
以上がGo でインターフェイスを返すインターフェイス メソッドを具象型の実装が満たさないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。