Maison  >  Article  >  développement back-end  >  Comment puis-je utiliser la réflexion pour obtenir l'adresse d'un champ non pointeur dans une structure imbriquée dans Go ?

Comment puis-je utiliser la réflexion pour obtenir l'adresse d'un champ non pointeur dans une structure imbriquée dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 11:06:02556parcourir

How can I use reflection to obtain the address of a non-pointer field within a nested structure in Go?

Obtenir un pointeur vers une valeur à l'aide de Reflection

Reflection fournit un mécanisme puissant pour examiner la structure et le comportement des objets dans Go. Cela peut être utilisé pour parcourir et analyser les champs d'une interface, quel que soit son type sous-jacent. Une tâche courante dans de tels scénarios consiste à récupérer l'adresse d'un champ non-pointeur.

Pour démontrer cela, considérons le code suivant :

<code class="go">type Z struct {
    Id int
}

type V struct {
    Id int
    F Z
}

type T struct {
    Id int
    F V
}</code>

Nous définissons une fonction InspectStruct pour parcourir le champs d’une interface et afficher leurs détails, y compris leurs valeurs et adresses. La fonction utilise la réflexion pour naviguer dans la structure de l'interface transmise.

Cependant, l'implémentation originale a été confrontée à un défi pour obtenir les adresses de champs non pointeurs à des profondeurs supérieures à celles de l'interface de niveau supérieur. Ce problème est résolu en modifiant la fonction pour accepter la réflexion.Value directement au lieu d'une valeur d'interface (interface{}).

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

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

Ce changement nous permet de travailler avec la valeur de réflexion réelle, nous permettant d'obtenir des adresses précises pour les champs non pointeurs, quelle que soit leur profondeur dans la structure. La sortie mise à jour d'InspectStruct affiche désormais les adresses correctes pour tous les champs de la structure fournie :

Field Name: Id,  Field Value: 1,     Address: 0x12345678 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {2 {3}},   Address: 0x12345679 , Field type: main.V    , Field kind: struct
Field Name: Id,  Field Value: 2,     Address: 0x1234567a , Field type: int   , Field kind: int
Field Name: F,   Field Value: {3},   Address: 0x1234567b , Field type: main.Z    , Field kind: struct
Field Name: Id,  Field Value: 3,     Address: 0x1234567c , Field type: int   , Field kind: int

En utilisant directement Reflect.Value, la fonction InspectStruct peut désormais obtenir avec succès les adresses de tous les champs, même ceux imbriqués. dans l'interface initiale.

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