Wie übergebe ich verschachtelte Strukturen als Referenz zur Reflexion?

Mary-Kate Olsen
Freigeben: 2024-10-24 01:49:01
Original
473 Leute haben es durchsucht

How to Pass Nested Structures by Reference for Reflection?

Übergabe verschachtelter Strukturen als Referenz zur Reflexion

Einführung

Beachten Sie den folgenden Kunden und Kontakt Datenstrukturen:

<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>
Nach dem Login kopieren

Unser Ziel ist es, Reflektion zu verwenden, um alle Client-Strukturfelder zu durchlaufen, Standardwerte für primitive Felder festzulegen und die gleichen Schritte rekursiv auf alle verschachtelten Strukturfelder anzuwenden. Beim Versuch, Werte für PrimaryContact-Felder festzulegen, tritt jedoch die Panik „reflect.Value.Set using unadressable value“ auf.

Übergabe als Referenz

Das Problem entsteht, weil PrimaryContact wird als Wert statt als Referenz übergeben. Um dieses Problem zu lösen, müssen wir PrimaryContact als Referenz übergeben. Dazu verwenden wir Value.Addr(), um einen Zeigerwert für das Strukturfeld zu erhalten.

Lösung

Der folgende Code zeigt, wie PrimaryContact als Referenz übergeben wird:

<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>
Nach dem Login kopieren

Durch die Verwendung von v.Field(i).Addr() zum Abrufen des Zeigerwerts jedes Strukturfelds können wir die tatsächlichen Strukturfelder anstelle einer Kopie ändern.

Beispiel

Um die Lösung zu veranschaulichen, betrachten wir die folgende Client-Instanz:

<code class="go">a := Client{}</code>
Nach dem Login kopieren

Nach dem Aufruf unserer SetDefault()-Funktion erhalten wir:

<code class="go">{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}</code>
Nach dem Login kopieren

Dies zeigt, dass die verschachtelten PrimaryContact-Strukturfelder ebenfalls auf Standardwerte gesetzt wurden.

Das obige ist der detaillierte Inhalt vonWie übergebe ich verschachtelte Strukturen als Referenz zur Reflexion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!