Im bereitgestellten Code wird die Datenstruktur von Ihnen festgelegt Die von mir definierte Struktur Family enthält eine Struktur, die als Zeiger in der Person-Struktur gespeichert ist. Wenn Sie versuchen, mithilfe des Reflect-Pakets auf Felder innerhalb der Familie zuzugreifen, auf die verwiesen wird, tritt die Fehlermeldung „Reflect: Aufruf von Reflect.Value.FieldByName auf PTR-Wert“ auf.
Verstehen des Fehlers
Dieser Fehler tritt auf, weil die FieldByName-Funktion des Reflect-Pakets einen Nicht-Zeigerwert als Eingabe erwartet. Wenn Sie einen Zeiger (*Family) als Empfänger von FieldByName verwenden, versucht die Funktion, auf den Zeiger selbst statt auf den Wert zuzugreifen, auf den er zeigt.
Problemlösung
Um dieses Problem zu beheben, müssen Sie den Zeiger umleiten, bevor Sie auf die Felder zugreifen. Dies kann mit der Indirect-Funktion des Reflect-Pakets erfolgen:
familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last")
Aktualisierter Code
Hier ist der aktualisierte Code, der den Zeigerwert korrekt verarbeitet:
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) } }
Das obige ist der detaillierte Inhalt vonWie greife ich mithilfe von Reflection in Go auf Felder einer spitzen Struktur zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!