Maison  >  Article  >  développement back-end  >  Comment obtenir un pointeur vers une valeur à l’aide de Reflection in Go ?

Comment obtenir un pointeur vers une valeur à l’aide de Reflection in Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 15:23:02535parcourir

How to Get a Pointer to a Value Using Reflection in Go?

Obtenir un pointeur vers une valeur à l'aide de la réflexion

Inspecter les champs d'une interface nécessite l'utilisation de la réflexion dans Go. Cependant, des défis surviennent lorsque l’on tente de récupérer l’adresse de champs non pointeurs. Cet article aborde ces défis et propose une solution.

Dans l'exemple de code fourni, une fonction nommée InspectStruct parcourt une structure donnée et génère des détails sur chaque champ. Bien que la plupart des champs soient pris en compte, les champs sans pointeur intégrés à des niveaux supérieurs dans la structure donnent des résultats « non adressables ».

Solution

Le problème réside dans le utilisation de la méthode reflex.Value.Interface(). Pour obtenir l'adresse d'un champ non-pointeur, il est recommandé de passer Reflect.Value au lieu de interface{} à la fonction InspectStruct. Le code corrigé ci-dessous intègre ce changement :

<code class="go">func InspectStructV(val reflect.Value) {
    // ... (remaining code is identical)
}

func InspectStruct(v interface{}) {
    InspectStructV(reflect.ValueOf(v))
}</code>

Avec cette modification, la fonction InspectStruct fonctionne comme prévu, produisant les adresses de tous les champs de la structure, quelle que soit leur profondeur ou l'état du pointeur. Cela peut être vu dans les résultats des tests mis à jour :

Field Name: Id,  Field Value: 1,     Address: 0x408125440 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {2 {3}},   Address: 0x408125444 , Field type: main.V    , Field kind: struct
Field Name: Id,  Field Value: 2,     Address: 0x408125450 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {3},   Address: 0x408125458 , Field type: main.Z    , Field kind: struct
Field Name: Id,  Field Value: 3,     Address: 0x408125460 , Field type: int   , Field kind: int

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