Dans le code fourni, la structure de données que vous J'ai défini inclut une famille de structures, qui est stockée sous forme de pointeur dans la structure Personne. Lorsque vous essayez d'accéder aux champs de la famille pointée à l'aide du package Reflect, vous rencontrez l'erreur « reflect : call of reflex.Value.FieldByName on ptr Value. »
Comprendre l'erreur
Cette erreur se produit car la fonction FieldByName du package Reflect attend une valeur autre qu'un pointeur comme entrée. Lorsque vous utilisez un pointeur (*Family) comme récepteur de FieldByName, la fonction tente d'accéder au pointeur lui-même au lieu de la valeur vers laquelle il pointe.
Résoudre le problème
Pour résoudre ce problème, vous devez indirecter le pointeur avant d'accéder aux champs. Cela peut être fait en utilisant la fonction Indirect du package Reflect :
familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last")
Code mis à jour
Voici le code mis à jour qui gère correctement la valeur du pointeur :
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) } }
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!