Grundsätzlich ist die einzige Möglichkeit (die ich kenne), die Werte der Felder von a zu durchlaufen, struct
wie folgt:
type Example struct {
a_number uint32
a_string string
}
//...
r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
//do something with the d
}
Ich habe mich gefragt, ob es einen besseren und vielseitigeren Weg gibt []interface{}{ r.a_number, r.a_string, }
, um dies zu erreichen. Ich muss also nicht jeden Parameter einzeln auflisten, oder gibt es alternativ einen besseren Weg, um eine Struktur zu durchlaufen?
Ich habe versucht, das reflect
Paket durchzusehen , bin aber gegen eine Wand gestoßen, weil ich nicht sicher bin, was ich tun soll, wenn ich es abrufe reflect.ValueOf(*r).Field(0)
.
Vielen Dank!
go
go-reflect
Omninonsense
quelle
quelle
Antworten:
Nachdem Sie
reflect.Value
das Feld mithilfe von abgerufen habenField(i)
, können Sie durch Aufrufen einen Schnittstellenwert daraus abrufenInterface()
. Dieser Schnittstellenwert repräsentiert dann den Wert des Feldes.Es gibt keine Funktion zum Konvertieren des Feldwerts in einen konkreten Typ, da, wie Sie vielleicht wissen, keine Generika vorhanden sind. Somit gibt es keine Funktion mit der Signatur
GetValue() T
mitT
wobei der Typ des Feldes (das natürlich ändert, auf dem Feld abhängig).Das nächste, was Sie in go erreichen können, ist
GetValue() interface{}
und genau dasreflect.Value.Interface()
bietet.Der folgende Code veranschaulicht, wie die Werte jedes exportierten Felds in einer Struktur mithilfe von Reflection ( Play ) abgerufen werden :
quelle
reflect.Value.Type()
ja. Beachten Sie jedoch, dass Typen keine erstklassigen Bürger sind, sodass Sie neue Werte dieses Typs nur mit instanziieren könnenreflect
.v.Field(i).Interface()
Panik, wenn Sie versuchen, auf nicht exportierte private Felder zuzugreifen. Sei einfach vorsichtig :)v.Field(i).CanInterface()
One kann die Panik bei nicht exportierten Feldern vermeiden.Wenn Sie durch die Felder und Werte einer Struktur iterieren möchten, können Sie den folgenden Go-Code als Referenz verwenden.
Lauf auf dem Spielplatz
Hinweis: Wenn die Felder in Ihrer Struktur nicht exportiert
v.Field(i).Interface()
werden, kommt es zu Panikpanic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
quelle
Nehmen Sie die Lösung von Chetan Kumar und falls Sie sich bei a bewerben müssen
map[string]int
quelle