Maison > Article > développement back-end > Pourquoi « reflect.Value.FieldByName » panique-t-il lorsqu'il est utilisé sur une valeur de pointeur ?
Reflect.Value.FieldByName Panic Explained
Lors de l'appel de la méthode .FieldByName sur une valeur réfléchie, vous pouvez rencontrer une erreur de panique similaire à :
<code class="go">panic: reflect: call of reflect.Value.FieldByName on ptr Value</code>
Cette erreur se produit généralement lorsque vous n'utilisez pas correctement Reflect.Value.
Dans l'exemple de code fourni :
<code class="go">s := reflect.ValueOf(&value).Elem() metric := s.FieldByName(subval.Metric).Interface()</code>
La racine du problème est-ce que la valeur est déjà un pointeur vers une structure. En prenant l'adresse de &value, vous créez un pointeur vers un pointeur. Lorsque vous appelez ensuite Elem(), vous déréférencez le pointeur vers le pointeur, ce qui n'est pas nécessaire.
Pour résoudre ce problème, utilisez simplement reflet.ValueOf(value).Elem() au lieu de réfléchir. ValueOf(&value).Elem(). Cela déréférencera correctement le pointeur d'origine, vous fournissant la valeur réelle de la structure.
Pour plus de clarté, vous trouverez ci-dessous une version modifiée de votre code :
<code class="go">s := reflect.ValueOf(value).Elem() metric := s.FieldByName(subval.Metric).Interface() fmt.Println(metric)</code>
En utilisant reflex.ValueOf(value .Elem(), vous obtenez la valeur réelle de la structure, vous permettant d'accéder à ses champs en utilisant s.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!