Maison  >  Article  >  développement back-end  >  Comment accéder aux champs d'une structure pointue à l'aide de la réflexion dans Go ?

Comment accéder aux champs d'une structure pointue à l'aide de la réflexion dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-08 04:36:02780parcourir

How to Access Fields of a Pointed Struct Using Reflection in Go?

Traitement des valeurs de pointeur dans Reflect : résolution des erreurs « reflect : appel de réflexion.Value.FieldByName sur ptr Value »

Dans le code fourni, la structure de données que vous J'ai défini inclut une famille de structures, qui est stockée sous forme de pointeur dans la structure Personne. Lorsque vous essayez d'accéder aux champs de la famille pointée à l'aide du package Reflect, vous rencontrez l'erreur « reflect : call of reflex.Value.FieldByName on ptr Value. »

Comprendre l'erreur

Cette erreur se produit car la fonction FieldByName du package Reflect attend une valeur autre qu'un pointeur comme entrée. Lorsque vous utilisez un pointeur (*Family) comme récepteur de FieldByName, la fonction tente d'accéder au pointeur lui-même au lieu de la valeur vers laquelle il pointe.

Résoudre le problème

Pour résoudre ce problème, vous devez indirecter le pointeur avant d'accéder aux champs. Cela peut être fait en utilisant la fonction Indirect du package Reflect :

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")
  • familyPtr récupère la réflexion.Valeur du champ familial.
  • Indirect(familyPtr) déréférence le pointeur, résultant en la valeur familiale réelle.
  • FieldByName("last") récupère ensuite le champ "dernier" de la valeur familiale déréférencée.

Code mis à jour

Voici le code mis à jour qui gère correctement la valeur du pointeur :

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        familyPtr := v.FieldByName("family")
        v = reflect.Indirect(familyPtr).FieldByName("last")
        fmt.Println(v)
    }
}

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