In diesem Artikel untersuchen wir ein Problem, das beim Versuch auftritt, Feldwerte einer Struktur abzurufen, die einen Zeiger auf enthält eine andere Struktur.
Betrachten Sie dieses Beispiel:
type Family struct { first string last string } type Person struct { name string family *Family }
Stellen Sie sich vor, wir haben eine Person mit ein Hinweis auf Familie. Wir wollen mittels Reflexion auf das letzte Feld der Familie zugreifen. Der folgende Code würde mit einem Fehler fehlschlagen:
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") v = v.FieldByName("family").FieldByName("last") fmt.Println(v) } }
Der aufgetretene Fehler ist:
Reflect: Aufruf von Reflect.Value.FieldByName auf ptr Value
Der Grund dafür Dieser Fehler besteht darin, dass wir versuchen, .FieldByName("family") für einen Reflect.Value aufzurufen, der einen Zeiger und nicht den Wert darstellt, auf den er zeigt zu.
Um dieses Problem zu beheben, müssen wir zuerst den Zeigerwert umleiten, bevor wir .FieldByName() aufrufen. Der korrigierte Code würde wie folgt aussehen:
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last") fmt.Println(v) } }
Durch indirekte Dereferenzierung des Zeigerwerts mit „reflect.Indirect()“ können wir auf den zugrunde liegenden Wert zugreifen und dann mit .FieldByName() das letzte Feld abrufen.
Das obige ist der detaillierte Inhalt vonWie rufe ich Feldwerte von Zeigern mithilfe von Reflection in Go ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!