Heim  >  Artikel  >  Backend-Entwicklung  >  Wie übergebe ich verschachtelte Strukturen als Referenz zur Reflexion?

Wie übergebe ich verschachtelte Strukturen als Referenz zur Reflexion?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-24 01:49:01477Durchsuche

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>

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>

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

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!

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