Maison >développement back-end >Golang >Comment éviter la panique lors de l'utilisation de « reflect.Value.FieldByName » sur les valeurs de pointeur ?

Comment éviter la panique lors de l'utilisation de « reflect.Value.FieldByName » sur les valeurs de pointeur ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 17:41:01488parcourir

How to Avoid Panics When Using `reflect.Value.FieldByName` on Pointer Values?

Panique de Reflect.Value.FieldByName sur la valeur du pointeur

La méthode .FieldByName d'une valeur réfléchie peut provoquer une panique si elle est appelée sur une valeur de pointeur. Le message d'erreur « panic : reflect : call of reflect.Value.FieldByName on ptr Value » indique que la valeur transmise à .FieldByName est un pointeur vers une structure, plutôt que la structure elle-même.

Pour éviter cela panique, il est important de s'assurer que la valeur transmise à .FieldByName est la structure réelle, et non un pointeur vers celle-ci. Cela peut être fait en utilisant la méthode Elem() sur la réflexion.Value représentant le pointeur pour le déréférencer.

Exemple :

<code class="go">s := reflect.ValueOf(value)
if s.Kind() == reflect.Ptr {
    s = s.Elem()
}
metric := s.FieldByName(subval.Metric).Interface()</code>

Dans cet exemple, la méthode Kind() est utilisée pour vérifier si la valeur est un pointeur. Si tel est le cas, la méthode Elem() est utilisée pour déréférencer le pointeur et obtenir la valeur de structure sous-jacente. Cette valeur déréférencée est ensuite transmise à .FieldByName pour récupérer le champ portant le nom spécifié.

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