Maison >développement back-end >Golang >Comment transmettre des structures imbriquées par référence dans la réflexion à l'aide de Value.Addr() ?

Comment transmettre des structures imbriquées par référence dans la réflexion à l'aide de Value.Addr() ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 03:34:02757parcourir

How to Pass Nested Structures By Reference in Reflection Using Value.Addr()?

Structures imbriquées et passage par référence en réflexion

Dans Go, comprendre les structures imbriquées et comment les passer par référence en réflexion est crucial. Considérons un scénario dans lequel vous disposez des structures Client et Contact imbriqué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>

Lorsque vous introspectez le champ PrimaryContact de la structure Client, vous pouvez rencontrer une panique "reflect.Value.Set utilisant une valeur non adressable". En effet, PrimaryContact est transmis par valeur et non par référence. Pour résoudre ce problème, nous devons transmettre PrimaryContact par référence en utilisant la réflexion.

Solution utilisant Value.Addr()

  1. Passez le pointeur vers la structure Client : Pour définir les valeurs de champ d'une structure à l'aide de la réflexion, vous devez la transmettre comme pointeur. Dans ce cas, &client est le pointeur vers la structure Client.
  2. Obtenir la valeur du pointeur du champ PrimaryContact : Utilisez Value.Addr() pour obtenir la valeur du pointeur du champ PrimaryContact. Cette valeur adressable peut être utilisée pour définir les valeurs de champ de la structure imbriquée.

Code :

<code class="go">package main

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 main() {
    client := Client{}

    v := reflect.ValueOf(&client)
    primaryContact := v.FieldByName("PrimaryContact").Addr()

    primaryContact.FieldByName("Id").SetInt(123)
    primaryContact.FieldByName("ClientId").SetInt(456)
    primaryContact.FieldByName("IsPrimary").SetBool(true)
    primaryContact.FieldByName("Email").SetString("example@example.com")

    fmt.Printf("%+v\n", client)
}</code>

Sortie :

{Id:0 Age:0 PrimaryContact:{Id:123 ClientId:456 IsPrimary:true Email:example@example.com} Name:}

Points clés :

  • Pour transmettre une structure imbriquée par référence, utilisez Reflect.Value.Addr().
  • Définissez les valeurs des champs à l'aide de Reflect.Value.SetInt(), Reflect.Value.SetString(), etc.
  • Parcourez les champs de structure pour définir les valeurs de toutes les structures imbriquées.

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