Obtention d'adresses de champ dans des structures imbriquées à l'aide de la réflexion
Dans ce scénario, vous souhaitez parcourir et examiner des structures imbriquées et obtenir les adresses de non -champs de pointeur à l'intérieur d'eux. En utilisant la réflexion, vous disposez d'une fonction qui parcourt les champs mais rencontre des difficultés à obtenir l'adresse mémoire des champs non pointeurs situés dans des sous-structures intégrées.
Pour remédier à ce problème, il est crucial de noter que valueField.Interface() le fait ne fournit pas le résultat attendu car il renvoie la valeur réelle stockée dans le champ, ce qui n'est pas valide lorsque vous travaillez avec des types non pointeurs.
La solution réside dans la modification de la fonction InspectStructV pour recevoir un reflet.Value au lieu de une interface{}. Cela permet de manipuler directement l'objet de réflexion et de récupérer l'adresse du champ. De plus, lors de l'appel récursif d'InspectStructV pour les champs de structure, valueField, qui contenait auparavant la valeur d'interface, pointe désormais directement vers la valeur de réflexion de la structure imbriquée, garantissant que l'adresse peut être récupérée correctement.
Voici le code révisé. extrait :
func InspectStructV(val reflect.Value) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i En effectuant ces modifications, vous pourrez récupérer avec succès les adresses mémoire des champs non pointeurs même lorsqu'ils résident dans des structures imbriquées.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3