Heim >Backend-Entwicklung >Golang >Können eingebettete Go-Methoden auf übergeordnete Strukturfelder zugreifen?

Können eingebettete Go-Methoden auf übergeordnete Strukturfelder zugreifen?

DDD
DDDOriginal
2024-12-06 08:02:11185Durchsuche

Can Embedded Go Methods Access Parent Struct Fields?

Können eingebettete Methoden auf übergeordnete Felder zugreifen?

In Go sind eingebettete Methoden ein leistungsstarker Mechanismus für die Wiederverwendung und Organisation von Code. Es stellt sich jedoch häufig die Frage: Können eingebettete Methoden direkt auf die Felder ihrer übergeordneten Struktur zugreifen?

Hintergrund

Für den Kontext nehmen wir an, Sie erstellen einen aktiven Datensatz. ORM-Stil für Go, bei dem gängige CRUD-Methoden zur besseren Lesbarkeit und Abstraktion in die Benutzerstruktur eingebettet sind. Dies würde es Ihnen ermöglichen, user.Save() anstelle von data.Save(user) zu schreiben.

Beispiel

Bedenken Sie diesen Codeausschnitt:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := Foo{Bar: &Bar{}, Name: "name"}
    test.Test()
}

type Foo struct {
    *Bar
    Name string
}

func (s *Foo) Method() {
    fmt.Println("Foo.Method()")
}

type Bar struct {
}

func (s *Bar) Test() {
    t := reflect.TypeOf(s)
    v := reflect.ValueOf(s)
    fmt.Printf("model: %+v %+v %+v\n", s, t, v)
    fmt.Println(s.Name)
    s.Method()
}

Frage erneut aufgegriffen

Die Frage, die hier vorliegt, ist, ob dies der Fall ist eine Möglichkeit, Felder der obersten Ebene über eingebettete Methoden zugänglich zu machen. Im obigen Beispiel ist die Testmethode in Bar eingebettet und versucht, über die übergeordnete Foo-Struktur auf das Feld „Name“ zuzugreifen.

Antwort

Go bietet diese leider nicht an Jeder direkte Mechanismus für eingebettete Methoden, um auf die Felder ihrer übergeordneten Struktur zuzugreifen. Der Empfänger der Testmethode ist ein Zeiger auf Bar, und Go kann nicht feststellen, ob er eingebettet ist oder nicht.

Mögliche Lösung

Zu erreichen Um diese Funktionalität zu nutzen, besteht eine mögliche Problemumgehung darin, der Bar-Struktur ein Interface{}-Mitglied hinzuzufügen, was erfordert, dass Typen, die es implementieren, das Mitglied auf den enthaltenden Typ festlegen. Die Initialisierung dieses Mitglieds kann entweder in der Verantwortung des Aufrufers liegen oder über eine ORM-Methode erfolgen. Dieser Ansatz bringt jedoch zusätzliche Komplexität und potenzielle Wartungsprobleme mit sich.

Alternative Perspektive

Alternativ können Sie die Möglichkeit in Betracht ziehen, dass die Strukturierung der API als db.Save(user) möglicherweise nicht erfolgt so schädlich sein, wie es scheint. Dieser Ansatz bietet eine unkomplizierte Möglichkeit, mehrere Datenbanken zu unterstützen und vermeidet die Abhängigkeit vom globalen Status.

Das obige ist der detaillierte Inhalt vonKönnen eingebettete Go-Methoden auf übergeordnete Strukturfelder zugreifen?. 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