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