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
Freigeben: 2024-11-08 11:49:02
Original
237 Leute haben es durchsucht

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

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

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

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!

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