Heim > Backend-Entwicklung > Golang > Wie greife ich mithilfe von Reflection in Go auf Felder einer spitzen Struktur zu?

Wie greife ich mithilfe von Reflection in Go auf Felder einer spitzen Struktur zu?

Susan Sarandon
Freigeben: 2024-11-08 04:36:02
Original
972 Leute haben es durchsucht

How to Access Fields of a Pointed Struct Using Reflection in Go?

Umgang mit Zeigerwerten in Reflect: Beheben von „reflect: call of reflekt.Value.FieldByName on ptr Value“-Fehlern

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")
Nach dem Login kopieren
  • familyPtr ruft den Reflect.Value des Familienfelds ab.
  • Indirect(familyPtr) dereferenziert den Zeiger, Daraus ergibt sich der tatsächliche Familienwert.
  • FieldByName("last") ruft dann das Feld „last“ aus dem dereferenzierten Familienwert ab.

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)
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage