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
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") } }
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")
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!