Maison  >  Article  >  développement back-end  >  Comment transmettre des structures imbriquées par référence pour la définition de valeurs basées sur la réflexion ?

Comment transmettre des structures imbriquées par référence pour la définition de valeurs basées sur la réflexion ?

DDD
DDDoriginal
2024-10-24 01:39:30256parcourir

How to Pass Nested Structures by Reference for Reflection-Based Value Setting?

Passage de structures imbriquées par référence pour la définition de valeurs basées sur la réflexion

La tâche à accomplir consiste à parcourir une structure imbriquée, à savoir le client, à l'aide de la réflexion . Pour chaque champ simple, le but est de définir une valeur par défaut. Cependant, le défi se pose lorsqu'il s'agit de gérer la structure Contact imbriquée dans le Client.

La réflexion permet l'introspection et la manipulation des structures de données au moment de l'exécution. Cependant, par défaut, les valeurs sont transmises par valeur plutôt que par référence. Cela signifie que la modification des champs d'une structure passée par valeur n'affectera pas l'argument d'origine.

Solution : Passer par référence

La clé pour surmonter ce problème réside en passant la structure Contact imbriquée par référence. Reflection fournit la méthode Value.Addr() pour obtenir l'adresse de la valeur, ce qui la convertit efficacement en pointeur. Ainsi, en passant Value.Addr() à la fonction qui définit les valeurs par défaut, les valeurs réelles dans la structure Contact peuvent être modifiées.

Implémentation

La fonction SetDefault prend un argument interface{} et définit les valeurs par défaut pour tous les types de champs pris en charge. Pour la structure Contact, Value.Addr() est utilisé pour transmettre la valeur par référence.

<code class="go">func setDefaultValue(v reflect.Value) error {
    switch v.Kind() {
        case reflect.Ptr:
            v = reflect.Indirect(v)
            fallthrough
        case reflect.Struct:
            // Iterate over the struct fields
            for i := 0; i < v.NumField(); i++ {
                err := setDefaultValue(v.Field(i).Addr())
                if err != nil {
                    return err
                }
            }
        default:
            // Set default values for supported types
            // ...
    }

    return nil
}</code>

Exemple

Considérons l'exemple suivant :

<code class="go">type Client struct {
    Id                int
    Age               int
    PrimaryContact    Contact
    Name              string
}

type Contact struct {
    Id        int
    ClientId  int
    IsPrimary bool
    Email     string
}

func main() {
    a := Client{}
    err := SetDefault(&a)
    if err != nil {
        fmt.Println("Error: ", err)
    } else {
        fmt.Printf("%+v\n", a)
    }
}</code>

Ce code s'imprimera :

{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}

Conclusion

En passant des structures imbriquées par référence en utilisant la réflexion, il est possible de parcourir et de définir des valeurs par défaut pour tous les champs d'une structure, y compris ceux des structures imbriquées. La méthode Value.Addr() fournie par la réflexion est cruciale pour y parvenir.

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!

Déclaration:
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