Aufruf von „reflect.Value.FieldByName()“ für den Zeigerwert
In Go wird bei Verwendung von Reflection mit Strukturzeigern versucht, Reflect aufzurufen .Value.FieldByName() auf den Zeigerwert der Struktur kann zu Folgendem führen Fehler:
reflect: call of reflect.Value.FieldByName on ptr Value
Problem
Dieser Fehler tritt auf, wenn Sie versuchen, auf ein Feld eines Strukturwerts zuzugreifen, der als Zeiger dargestellt wird. Betrachten Sie das folgende Beispiel:
type Family struct { first string last string } type Person struct { name string family *Family // Pointer to Family struct } func Check(data interface{}) { v := reflect.ValueOf(data) if v.Kind() == reflect.Struct { v = v.FieldByName("family").FieldByName("last") } }
Beim Ausführen dieses Codes tritt der Fehler auf, weil das Familienfeld ein Zeiger ist.
Lösung
Um dieses Problem zu beheben Bei diesem Problem müssen Sie den Zeigerwert mit „reflect.Indirect()“ dereferenzieren, um den tatsächlichen Strukturwert zu erhalten, bevor Sie auf die zugreifen Feld:
v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")
Mit dieser Änderung greift der Code korrekt auf das letzte Feld der Familienstruktur zu, unabhängig davon, ob Familie ein Wert oder ein Zeiger ist.
Erklärung
reflect.Indirect() gibt den Wert zurück, auf den der Zeiger zeigt. In diesem Fall wird also der Family-Strukturwert zurückgegeben, auf den dann über FieldByName() zugegriffen werden kann.
Das obige ist der detaillierte Inhalt vonWie greife ich mit „reflect.Value.FieldByName()' in Go auf Felder in einem Strukturzeiger zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!