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!