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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 22:00:31463parcourir

Why does `reflect.Value.FieldByName` panic when called on a pointer value?

Reflect.Value.FieldByName provoquant une panique

La méthode .FieldByName d'une valeur réfléchie génère une panique lorsqu'elle est appelée sur une valeur de pointeur. Le message d'erreur « reflect : call of reflex.Value.FieldByName on ptr Value » est généré lorsque la valeur fournie est un pointeur vers une structure plutôt que la structure elle-même.

Dans le code fourni, la ligne "s := reflex.ValueOf(&value).Elem()" crée un pointeur vers la structure de valeur puis la déréférence en utilisant Elem(), ce qui est inutile. Au lieu de cela, pour accéder et modifier les champs de la structure, utilisez "s := reflex.ValueOf(value).Elem()".

L'extrait de code corrigé suivant élimine la panique :

s := reflect.ValueOf(value).Elem()
metric := s.FieldByName(subval.Metric).Interface()
fmt.Println(metric)

En réfléchissant directement à la valeur de la structure au lieu de créer un pointeur inutile, vous pouvez accéder et manipuler ses champs correctement sans paniquer.

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