Wie lege ich Standardwerte für verschachtelte Strukturen mithilfe von Reflection by Reference fest?

Susan Sarandon
Freigeben: 2024-10-24 03:31:02
Original
886 Leute haben es durchsucht

How to Set Default Values for Nested Structures Using Reflection by Reference?

Übergabe verschachtelter Strukturen als Referenz zur Reflexion

Diese Frage untersucht die Herausforderung, verschachtelte Strukturen mithilfe von Reflexion zu durchlaufen und Standardwerte für Felder festzulegen. Das Hauptproblem besteht darin, dass die Übergabe verschachtelter Strukturen nach Wert verhindert, dass sich Feldaktualisierungen in der ursprünglichen Struktur widerspiegeln.

Um dieses Problem zu beheben, müssen wir Strukturen als Referenz mithilfe von Reflektion übergeben. Die Lösung umfasst die folgenden Schritte:

  1. Greifen Sie auf den Zeigerwert der verschachtelten Struktur zu:

    • Rufen Sie den Reflect.Value von ab Strukturieren und umleiten, um seinen Zeigerwert zu erhalten.
  2. Rekursiv über Felder iterieren:

    • Verwenden Sie eine rekursive Funktion, um Iterieren Sie über jedes Feld der Struktur und verwenden Sie für jedes Strukturfeld seinen Zeigerwert, um Standardwerte rekursiv festzulegen.

Hier ist eine funktionierende Implementierung:

<code class="go">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 SetDefault(s interface{}) error {
    return setDefaultValue(reflect.ValueOf(s).Elem())
}

func setDefaultValue(v reflect.Value) error {
    switch v.Kind() {
        case reflect.Int:
            v.SetInt(42)
        case reflect.String:
            v.SetString("Foo")
        case reflect.Bool:
            v.SetBool(true)
        case reflect.Struct:
            // Recursive call using the pointer value of the nested struct
            err := setDefaultValue(v.Addr())
            if err != nil {
                return err
            }
        default:
            return errors.New("Unsupported kind: " + v.Kind().String())
    }

    return nil
}

func main() {
    a := Client{}
    err := SetDefault(&a)
    if err != nil {
        fmt.Println("Error: ", err)
    } else {
        fmt.Printf("%+v\n", a)
    }
}</code>
Nach dem Login kopieren

Dieser Code legt rekursiv Standardwerte für alle primitiven Felder und verschachtelten Strukturen fest, indem er sie mithilfe von Reflektion als Referenz übergibt. Die Beispielausgabe lautet:

{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}
Nach dem Login kopieren

Mit dieser Technik können Sie mithilfe von Reflektion effektiv eine Schleife durch verschachtelte Strukturen durchführen und Standardwerte festlegen und gleichzeitig sicherstellen, dass Änderungen an die ursprüngliche Struktur zurückgegeben werden.

Das obige ist der detaillierte Inhalt vonWie lege ich Standardwerte für verschachtelte Strukturen mithilfe von Reflection by Reference fest?. 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!