Wie Sie die Schleife durch die Felder in einem Golang struct zu get-und set-Werte in einem erweiterbaren Weg?
Ich habe eine struct Person.
type Person struct {
Firstname string
Lastname string
Years uint8
}
Dann habe ich zwei Instanzen dieser Struktur, PersonA und PersonB.
PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
Ich möchte eine Funktion schreiben, die Kopien der Werte von PersonA zu PersonB gegeben eine Bedingung für jedes Feld ein (d.h. nicht leer). Ich weiß, wie Sie dies tun, indem die hartcodierung des Feldes Namen, aber ich will eine Funktion, die funktioniert auch wenn ich die Person struct.
Ich weiß, Gehen überlegungen ist hilfreich, aber das Problem ist das abrufen und festlegen der Werte erfordert die Kenntnis der Arten, wenn Sie wollen, etwas zu verwenden, wie SetInt. Aber es ist eine "einfache" Möglichkeit, dies zu tun?
** Javascript-Analogie **
In Javascript können Sie einfach ein (für Immobilien in someObject) zu Durchlaufen.
(for propt in personA) {
if personA[propt] != "" {
//do something
personB[propt] = personA[propt]
}
}
Optionen, die ich habe ausgeschlossen:
-
Verfolgen Sie die Felder in den einzelnen struct in eine Karte, dann eine Kombination von FieldByName und die Sammlung von Set* - Funktionen in der reflektieren pkg.
-
Erstellen einer Schleife durch die Felder von Person manuell (unten). Weil ich will, zu tun, diese Art von "update" für viele andere Strukturen (Schule, Tiere, etc...)
if PersonA.Firstname != "" { PersonB.Firstname = PersonA.Firstname }
...
if PersonA.Years != "" { PersonB.Years = PersonA.Years }
Die Frage bringt mich auf halbem Weg dorthin, aber noch ist nicht erweiterbar, um alle Strukturen, für die will ich nutzen dieses "update" Funktion.
in golang, mit reflektieren, wie Sie den Wert eines struct-Feld?
** Weitere Nützliche Links **
GoLang: Zugriff auf struct-Eigenschaft nach Namen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
reflect.ValueOf()
zu konvertieren, um den konkreten Typ. Danach könnten Sie reflektieren.Wert.SetString, um den Wert, den Sie wollen.Hier ist die Lösung
f2.Set(reflect.Value(f))
ist hier der Schlüsselhttp://play.golang.org/p/UKFMBxfbZD
Reflexion sollte alles, was Sie brauchen. Dies scheint ähnlich (aber nicht identisch) "Tiefe Kopie" - Semantik, die umgesetzt wurde, bei https://godoc.org/github.com/getlantern/deepcopy
Sollten Sie angepasst werden können, die zu Ihren Bedürfnissen, oder zumindest einige Ideen von ihm.
map[string]interface{}
oder was auch immer) statt der Objekt-Typen.Sollten Sie eine
map[string]interface{}
stattdessen wird viel schneller (obwohl noch nicht so schnell, wie Sie die richtige Logik mit den tatsächlichen Strukturen).