Maison > développement back-end > Golang > Comment obtenir des adresses de champ dans des structures imbriquées à l'aide de Reflection ?

Comment obtenir des adresses de champ dans des structures imbriquées à l'aide de Reflection ?

Susan Sarandon
Libérer: 2024-10-30 14:08:03
original
667 Les gens l'ont consulté

How to Obtain Field Addresses in Nested Structures Using Reflection?

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

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!

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