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
Mary-Kate Olsenoriginal
2024-11-09 07:46:021084parcourir

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
}

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)
    }
}

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)
    }
}

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!

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