Wie rufe ich Feldwerte von Zeigern mithilfe von Reflection in Go ab?

Mary-Kate Olsen
Freigeben: 2024-11-09 07:46:02
Original
1038 Leute haben es durchsucht

How to Retrieve Field Values of Pointers Using Reflection in Go?

Feldwerte von Zeigern mithilfe von Reflection abrufen

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

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

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

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!

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