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!