Maison  >  Article  >  développement back-end  >  Pourquoi « reflect.Value.FieldByName » panique-t-il lorsqu'il est utilisé sur une valeur de pointeur ?

Pourquoi « reflect.Value.FieldByName » panique-t-il lorsqu'il est utilisé sur une valeur de pointeur ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 19:25:03815parcourir

Why Does `reflect.Value.FieldByName` Panic When Used on a Pointer Value?

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!

Déclaration:
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