Heim > Backend-Entwicklung > Golang > Können eingebettete Strukturen für die Methodenvererbung in Go ersetzt werden?

Können eingebettete Strukturen für die Methodenvererbung in Go ersetzt werden?

Patricia Arquette
Freigeben: 2024-11-01 02:54:28
Original
917 Leute haben es durchsucht

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

Eingebettete Strukturen und Methodenvererbung

Gibt es eine Alternative zu eingebetteten Strukturen für die Vererbung von Methoden?

Ja, die gibt es eine alternative Möglichkeit, Methoden eines Typs zu erben, ohne eingebettete Strukturen zu verwenden. Es erfordert jedoch ein tieferes Verständnis des Typsystems von Go.

Eingebettete Strukturen

In Go ermöglicht das Einbetten einer Struktur den Zugriff auf die Felder und Methoden der eingebetteten Struktur als ob sie Teil der enthaltenden Struktur wären. Dies ist eine leistungsstarke Funktion, die zum Erstellen von Vererbungen zwischen Typen verwendet werden kann.

Das Problem

Wenn Sie eine Struktur einbetten, gilt dies nicht für den Methodensatz der eingebetteten Struktur automatisch in die enthaltende Struktur hochgestuft. Um Methoden zu fördern, muss die eingebettete Struktur anonym sein.

Methodenförderung

Methodenförderung ist eine Sprachfunktion, die den Zugriff auf Methoden aus einer anonymen eingebetteten Struktur ermöglicht, als ob es waren Methoden der enthaltenden Struktur. Dies wird durch Befolgen dieser Regeln erreicht:

  • Wenn das anonyme Feld den Typ T hat, haben geförderte Methoden Empfänger vom Typ T und *T.
  • Wenn das anonyme Feld den Typ *T hat , geförderte Methoden haben Empfänger vom Typ T oder *T.

Beispiel

Betrachten Sie den folgenden Code:

<code class="go">type Props map[string]interface{}

func (p Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := Node{"test": "foo"}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>
Nach dem Login kopieren

In diesem Beispiel bettet die Node-Struktur eine anonyme Struktur ein vom Typ Requisiten. Dadurch kann die GetString-Methode von Props auf Node heraufgestuft werden.

Alternativer Ansatz

Ein alternativer Ansatz ohne Einbettung ist die Verwendung eines Zeigerempfängers. Indem Sie einen Zeiger auf die Empfängerfunktion übergeben, können Sie auf die Felder und Methoden der zugrunde liegenden Struktur zugreifen, ohne diese einbetten zu müssen.

Beispiel

Hier ist eine alternative Implementierung Verwendung eines Zeigerempfängers:

<code class="go">type Props map[string]interface{}

func (p *Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := &Node{Props{"test": "foo"}}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>
Nach dem Login kopieren

In diesem Beispiel verwenden wir einen Zeigerempfänger für die GetString-Methode. Dies ermöglicht uns den Zugriff auf die Felder und Methoden der zugrunde liegenden Props-Struktur, ohne sie einbetten zu müssen.

Fazit

Eingebettete Strukturen sind zwar ein leistungsstarkes Werkzeug für die Vererbung, aber sie sind nicht immer die beste Wahl. In Fällen, in denen eine Methodenförderung nicht erwünscht oder erforderlich ist, kann die Verwendung eines Zeigerempfängers eine flexiblere und leistungsfähigere Alternative darstellen.

Das obige ist der detaillierte Inhalt vonKönnen eingebettete Strukturen für die Methodenvererbung in Go ersetzt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage