Maison > développement back-end > Golang > 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
Libérer: 2024-10-24 01:39:30
original
377 Les gens l'ont consulté

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

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

Ce code s'imprimera :

{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}
Copier après la connexion

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!

source:php
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal