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() 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 :
<code class="go">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 < val.NumField(); i++ { valueField := val.Field(i) typeField := val.Type().Field(i) address := "not-addressable" if valueField.Kind() == reflect.Interface && !valueField.IsNil() { elm := valueField.Elem() if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr { valueField = elm } } if valueField.Kind() == reflect.Ptr { valueField = valueField.Elem() } if valueField.CanAddr() { address = fmt.Sprintf("0x%X", valueField.Addr().Pointer()) } fmt.Printf("Field Name: %s,\t Field Value: %v,\t Address: %v\t, Field type: %v\t, Field kind: %v\n", typeField.Name, valueField.Interface(), address, typeField.Type, valueField.Kind()) if valueField.Kind() == reflect.Struct { InspectStructV(valueField) } } } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
En apportant 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.
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!