In Go stimmt eine Schnittstellenmethode, die eine Schnittstelle zurückgibt, nur mit einer Implementierung überein, die die Schnittstelle selbst deklariert, nicht mit einer konkreten Typ, der die Schnittstelle implementiert. Betrachten Sie das folgende Beispiel:
<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>
Dieser Code gibt den folgenden Fehler bei der Kompilierung aus:
cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method)
Um dieses Problem zu beheben, sollte entweder die GetStringer-Methode im Bar-Typ einen fmt zurückgeben .Stringer-Schnittstelle anstelle eines konkreten *Foo-Typs, oder die StringerGetter-Schnittstelle sollte so geändert werden, dass sie einen konkreten Typ anstelle einer Schnittstelle akzeptiert.
In Fällen, in denen der externe konkrete Typ geändert wird oder die gemeinsame Schnittstelle nicht wünschenswert ist, gibt es zwei alternative Lösungen:
<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>
Beide Ansätze ermöglichen es Ihnen, mit dem externen konkreten Typ zu arbeiten und gleichzeitig die gewünschte Schnittstellenimplementierung bereitzustellen, ohne den ursprünglichen Typ oder die gemeinsam genutzte Schnittstelle zu ändern.
Das obige ist der detaillierte Inhalt vonWarum erfüllt eine konkrete Typimplementierung eine Schnittstellenmethode nicht, die eine Schnittstelle in Go zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!