Heim >Backend-Entwicklung >Golang >Wie greife ich mit „reflect.Value.FieldByName()' in Go auf Felder in einem Strukturzeiger zu?

Wie greife ich mit „reflect.Value.FieldByName()' in Go auf Felder in einem Strukturzeiger zu?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-08 11:49:02264Durchsuche

How to Access Fields in a Struct Pointer using `reflect.Value.FieldByName()` in Go?

Aufruf von „reflect.Value.FieldByName()“ für den Zeigerwert

In Go wird bei Verwendung von Reflection mit Strukturzeigern versucht, Reflect aufzurufen .Value.FieldByName() auf den Zeigerwert der Struktur kann zu Folgendem führen Fehler:

reflect: call of reflect.Value.FieldByName on ptr Value

Problem
Dieser Fehler tritt auf, wenn Sie versuchen, auf ein Feld eines Strukturwerts zuzugreifen, der als Zeiger dargestellt wird. Betrachten Sie das folgende Beispiel:

type Family struct {
  first string
  last string
}
type Person struct {
  name string
  family *Family // Pointer to Family struct
}

func Check(data interface{}) {
  v := reflect.ValueOf(data)
  if v.Kind() == reflect.Struct {
    v = v.FieldByName("family").FieldByName("last")
  }
}

Beim Ausführen dieses Codes tritt der Fehler auf, weil das Familienfeld ein Zeiger ist.

Lösung
Um dieses Problem zu beheben Bei diesem Problem müssen Sie den Zeigerwert mit „reflect.Indirect()“ dereferenzieren, um den tatsächlichen Strukturwert zu erhalten, bevor Sie auf die zugreifen Feld:

v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")

Mit dieser Änderung greift der Code korrekt auf das letzte Feld der Familienstruktur zu, unabhängig davon, ob Familie ein Wert oder ein Zeiger ist.

Erklärung
reflect.Indirect() gibt den Wert zurück, auf den der Zeiger zeigt. In diesem Fall wird also der Family-Strukturwert zurückgegeben, auf den dann über FieldByName() zugegriffen werden kann.

Das obige ist der detaillierte Inhalt vonWie greife ich mit „reflect.Value.FieldByName()' in Go auf Felder in einem Strukturzeiger zu?. 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