Maison > développement back-end > Golang > le corps du texte

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
Libérer: 2024-10-31 11:06:02
original
630 Les gens l'ont consulté

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

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

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

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!

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