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 :
Accéder à la valeur du pointeur de la structure imbriquée :
Itérer de manière récursive sur les champs :
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!