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() ?
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()
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 :
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!