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!