Maison > développement back-end > Golang > Comment accéder aux champs d'un pointeur Struct en utilisant `reflect.Value.FieldByName()` dans Go ?

Comment accéder aux champs d'un pointeur Struct en utilisant `reflect.Value.FieldByName()` dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-08 11:49:02
original
235 Les gens l'ont consulté

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

Appel de `reflect.Value.FieldByName() sur la valeur du pointeur

Dans Go, lors de l'utilisation de la réflexion avec des pointeurs de structure, tentative d'appel de la réflexion .Value.FieldByName() sur la valeur du pointeur de la structure peut entraîner ce qui suit erreur :

reflect: call of reflect.Value.FieldByName on ptr Value
Copier après la connexion

Problème
Cette erreur se produit lorsque vous essayez d'accéder à un champ d'une valeur de structure qui est représentée sous forme de pointeur. Prenons l'exemple suivant :

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")
  }
}
Copier après la connexion

Lors de l'exécution de ce code, l'erreur se produira car le champ familial est un pointeur.

Solution
Pour résoudre ce problème problème, vous devez déréférencer la valeur du pointeur à l'aide de reflex.Indirect() pour obtenir la valeur réelle de la structure avant d'accéder au field :

v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")
Copier après la connexion

Avec cette modification, le code accédera correctement au dernier champ de la structure Family, que la famille soit une valeur ou un pointeur.

Explication
reflect.Indirect() renvoie la valeur vers laquelle pointe le pointeur. Ainsi, dans ce cas, il renvoie la valeur de la structure Family, qui est ensuite accessible via FieldByName().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal