Maison > développement back-end > Golang > 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
Libérer: 2024-11-03 19:25:03
original
895 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal