Heim >Backend-Entwicklung >Golang >Wie rufe ich Feldwerte von Zeigern mithilfe von Reflection in Go ab?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 07:46:021076Durchsuche

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
}

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!

Stellungnahme:
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