Dans cet article, nous explorerons un problème rencontré lors de la tentative de récupération des valeurs de champ d'une structure contenant un pointeur vers une autre structure.
Considérez cet exemple :
type Family struct { first string last string } type Person struct { name string family *Family }
Imaginez que nous ayons une personne avec un pointeur vers Famille. Nous souhaitons accéder au dernier champ de Famille par la réflexion. Le code suivant échouerait avec une erreur :
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") v = v.FieldByName("family").FieldByName("last") fmt.Println(v) } }
L'erreur rencontrée est :
reflect : appel de réflexion.Value.FieldByName sur ptr Value
La raison de cette erreur est que nous essayons d'appeler .FieldByName("family") sur un reflet.Value qui représente un pointeur, plutôt que la valeur qu'il pointe to.
Pour résoudre ce problème, nous devons d'abord indirecter la valeur du pointeur avant d'appeler .FieldByName(). Le code corrigé ressemblerait à ceci :
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) } }
En déréférençant indirectement la valeur du pointeur à l'aide de reflex.Indirect(), nous pouvons accéder à la valeur sous-jacente puis récupérer le dernier champ à l'aide de .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!