Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfüllt eine konkrete Typimplementierung eine Schnittstellenmethode nicht, die eine Schnittstelle in Go zurückgibt?

Warum erfüllt eine konkrete Typimplementierung eine Schnittstellenmethode nicht, die eine Schnittstelle in Go zurückgibt?

DDD
DDDOriginal
2024-10-26 22:48:03336Durchsuche

Why Doesn't a Concrete Type Implementation Satisfy an Interface Method Returning an Interface in Go?

Schnittstellenmethode, die eine Schnittstelleninkongruenz mit konkreter Typimplementierung zurückgibt

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.

Alternative Lösungen

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:

  1. Erstellen eines Wrapper-Typs: Sie können einen neuen Typ erstellen, der den externen konkreten Typ umhüllt und das Gewünschte implementiert Schnittstelle. Zum Beispiel:
<code class="go">type MyBar struct {
    Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
  1. Einbetten des Betontyps: Alternativ können Sie den externen Betontyp in Ihren eigenen Typ einbetten und die Schnittstelle mithilfe der eingebetteten Typen implementieren Methoden. Zum Beispiel:
<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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn