Maison  >  Article  >  développement back-end  >  Comment définir des valeurs par défaut pour les structures imbriquées à l'aide de la réflexion par référence ?

Comment définir des valeurs par défaut pour les structures imbriquées à l'aide de la réflexion par référence ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-24 03:31:02878parcourir

How to Set Default Values for Nested Structures Using Reflection by Reference?

Passage de structures imbriquées par référence pour la réflexion

Cette question explore le défi de parcourir des structures imbriquées en utilisant la réflexion et en définissant des valeurs par défaut pour les champs. Le principal problème rencontré est que le passage des structures imbriquées par valeur empêche les mises à jour des champs d'être reflétées dans la structure d'origine.

Pour résoudre ce problème, nous devons transmettre les structures par référence en utilisant la réflexion. La solution implique les étapes suivantes :

  1. Accéder à la valeur du pointeur de la structure imbriquée :

    • Récupérer le reflet.Valeur du structurez-le et indirect pour obtenir sa valeur de pointeur.
  2. Itérer de manière récursive sur les champs :

    • Utilisez une fonction récursive pour parcourez chaque champ de la structure et pour chaque champ de structure, utilisez la valeur de son pointeur pour définir les valeurs par défaut de manière récursive.

Voici une implémentation fonctionnelle :

<code class="go">import (
    "fmt"
    "reflect"
)

type Client struct {
    Id                int
    Age               int
    PrimaryContact    Contact
    Name              string
}

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

func SetDefault(s interface{}) error {
    return setDefaultValue(reflect.ValueOf(s).Elem())
}

func setDefaultValue(v reflect.Value) error {
    switch v.Kind() {
        case reflect.Int:
            v.SetInt(42)
        case reflect.String:
            v.SetString("Foo")
        case reflect.Bool:
            v.SetBool(true)
        case reflect.Struct:
            // Recursive call using the pointer value of the nested struct
            err := setDefaultValue(v.Addr())
            if err != nil {
                return err
            }
        default:
            return errors.New("Unsupported kind: " + v.Kind().String())
    }

    return nil
}

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

Ce code définit de manière récursive les valeurs par défaut pour tous les champs primitifs et structures imbriquées en les passant par référence à l'aide de la réflexion. L'exemple de résultat est :

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

En utilisant cette technique, vous pouvez parcourir efficacement des structures imbriquées en utilisant la réflexion et définir des valeurs par défaut tout en garantissant que les modifications sont propagées à la structure d'origine.

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