Heim >Backend-Entwicklung >Golang >Wie übergebe ich verschachtelte Strukturen als Referenz in Reflection mithilfe von Value.Addr()?

Wie übergebe ich verschachtelte Strukturen als Referenz in Reflection mithilfe von Value.Addr()?

Linda Hamilton
Linda HamiltonOriginal
2024-10-24 03:34:02755Durchsuche

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

Verschachtelte Strukturen und Referenzübergabe in der Reflexion

In Go geht es darum, verschachtelte Strukturen zu verstehen und zu erfahren, wie man sie in der Reflexion als Referenz übergeben kann entscheidend. Stellen Sie sich ein Szenario vor, in dem Sie über die verschachtelten Strukturen „Client“ und „Kontakt“ verfügen:

<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>

Wenn Sie das Feld „PrimaryContact“ der Struktur „Client“ überprüfen, kann es zu einer „Reflect.Value.Set using unadressable value“-Panik kommen. Dies liegt daran, dass PrimaryContact als Wert und nicht als Referenz übergeben wird. Um dieses Problem zu lösen, müssen wir PrimaryContact als Referenz mithilfe von Reflektion übergeben.

Lösung mit Value.Addr()

  1. Übergeben Sie den Zeiger an die Client-Struktur: Um Feldwerte einer Struktur mithilfe von Reflektion festzulegen, müssen Sie sie als Zeiger übergeben. In diesem Fall ist &client der Zeiger auf die Client-Struktur.
  2. Zeigerwert des PrimaryContact-Felds abrufen: Verwenden Sie Value.Addr(), um den Zeigerwert des PrimaryContact-Felds abzurufen. Dieser adressierbare Wert kann zum Festlegen der Feldwerte der verschachtelten Struktur verwendet werden.

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>

Ausgabe:

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

Wichtige Punkte:

  • Um eine verschachtelte Struktur als Referenz zu übergeben, verwenden Sie „reflect.Value.Addr()“.
  • Legen Sie Feldwerte mit „reflect.Value.SetInt()“, „reflect.Value.SetString()“ usw. fest.
  • Iterieren Sie über die Strukturfelder, um Werte für alle verschachtelten Strukturen festzulegen.

Das obige ist der detaillierte Inhalt vonWie übergebe ich verschachtelte Strukturen als Referenz in Reflection mithilfe von Value.Addr()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn