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

Comment transmettre des structures imbriquées par référence pour la réflexion ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 01:49:01474parcourir

How to Pass Nested Structures by Reference for Reflection?

Passer des structures imbriquées par référence pour la réflexion

Introduction

Considérez le client et le contact suivants structures de données :

<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
}</code>

Notre objectif est d'utiliser la réflexion pour parcourir tous les champs de structure client, définir les valeurs par défaut pour les champs primitifs et appliquer de manière récursive les mêmes étapes à tous les champs de structure imbriqués. Cependant, nous rencontrons une panique « reflect.Value.Set utilisant une valeur non adressable » lorsque nous essayons de définir des valeurs pour les champs PrimaryContact.

Passage par référence

Le problème se pose car PrimaryContact est transmis par valeur plutôt que par référence. Pour résoudre ce problème, nous devons passer PrimaryContact par référence. Pour cela, nous utilisons Value.Addr() pour obtenir une valeur de pointeur pour le champ struct.

Solution

Le code suivant montre comment passer PrimaryContact par référence :

<code class="go">func setDefaultValue(v reflect.Value) error {
    if v.Kind() != reflect.Ptr {
        return errors.New("Not a pointer value")
    }
    v = reflect.Indirect(v)
    
    // ... (same code as before)
    
    case reflect.Struct:
        for i := 0; i < v.NumField(); i++ {
            err := setDefaultValue(v.Field(i).Addr())
            if err != nil {
                return err
            }
        }
    }
    
    return nil  
}</code>

En utilisant v.Field(i).Addr() pour obtenir la valeur du pointeur de chaque champ de structure, nous pouvons modifier les champs de structure réels au lieu d'une copie.

Exemple

Pour illustrer la solution, considérons l'instance Client suivante :

<code class="go">a := Client{}</code>

Après avoir invoqué notre fonction SetDefault(), nous obtenons :

<code class="go">{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}</code>

Cela démontre que les champs de structure PrimaryContact imbriqués ont également été définis sur les valeurs par défaut.

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