Maison > développement back-end > Golang > Comment récupérer les valeurs de champ des pointeurs à l'aide de Reflection in Go ?

Comment récupérer les valeurs de champ des pointeurs à l'aide de Reflection in Go ?

Mary-Kate Olsen
Libérer: 2024-11-09 07:46:02
original
1064 Les gens l'ont consulté

How to Retrieve Field Values of Pointers Using Reflection in Go?

Obtention des valeurs de champ de pointeurs à l'aide de Reflection

Dans cet article, nous explorerons un problème rencontré lors de la tentative de récupération des valeurs de champ d'une structure contenant un pointeur vers une autre structure.

Considérez cet exemple :

type Family struct {
   first string
   last string
}

type Person struct {
   name string
   family *Family
}
Copier après la connexion

Imaginez que nous ayons une personne avec un pointeur vers Famille. Nous souhaitons accéder au dernier champ de Famille par la réflexion. Le code suivant échouerait avec une erreur :

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

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}
Copier après la connexion

L'erreur rencontrée est :

reflect : appel de réflexion.Value.FieldByName sur ptr Value

La raison de cette erreur est que nous essayons d'appeler .FieldByName("family") sur un reflet.Value qui représente un pointeur, plutôt que la valeur qu'il pointe to.

Pour résoudre ce problème, nous devons d'abord indirecter la valeur du pointeur avant d'appeler .FieldByName(). Le code corrigé ressemblerait à ceci :

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

En déréférençant indirectement la valeur du pointeur à l'aide de reflex.Indirect(), nous pouvons accéder à la valeur sous-jacente puis récupérer le dernier champ à l'aide de .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