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!