Maison > Article > développement back-end > Comment obtenir un pointeur vers une valeur à l’aide de 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!