Wie durchlaufen Sie die Felder in einer Golang-Struktur, um Werte auf erweiterbare Weise zu erhalten und festzulegen?

8

Ich habe eine Struktur Person.

%Vor%

Dann habe ich zwei Instanzen dieser Struktur, PersonA und PersonB.

%Vor%

Ich möchte eine Funktion schreiben, die die Werte von PersonA nach PersonB kopiert, wobei für jedes Feld eine Bedingung (d. h. nicht leer) gegeben ist. Ich weiß, wie man das macht, indem ich die Feldnamen fest kodiere, aber ich will eine Funktion, die funktioniert, selbst wenn ich die Person struct ändere.

Ich weiß, Go-Reflexionen sind hilfreich, aber das Problem ist, die Werte zu erhalten und zu setzen, wenn man die Typen kennt, wenn man etwas wie SetInt verwenden will. Aber gibt es einen "einfachen" Weg, dies zu tun?

** Javascript Analogie ** In Javascript könnten Sie einfach eine (für die Eigenschaft in someObject) durchlaufen.

%Vor%

Optionen, die ich ausgeschlossen habe:

  1. Verfolgen der Felder in jeder Struktur in einer Map, dann Verwenden einer Kombination aus FieldByName und der Auflistung von Set * -Funktionen in der reflektiert pkg .

  2. Erstellen Sie manuell eine Schleife durch die Felder von Person (unten). Weil ich diese Art von "Update" für viele andere Strukturen (Schule, Tiere, etc ...) machen möchte.

    %Vor%

    ...

    %Vor%

Die folgende Frage bringt mich zur Hälfte, ist aber immer noch nicht für alle Strukturen erweiterbar, für die ich diese "update" -Funktion verwenden möchte.

in golang, mit reflect, wie setzt man den Wert eines struct-Feldes?

** Weitere hilfreiche Links ** GoLang: Zugriff auf die struct-Eigenschaft nach Name

    
platwp 28.04.2014, 20:03
quelle

4 Antworten

3

Hier ist die Lösung f2.Set(reflect.Value(f)) ist der Schlüssel hier

%Vor%

Ссылка

    
archie 15.03.2016 23:15
quelle
2

Reflexion sollte alles sein, was Sie brauchen. Dies scheint der "Deep Copy" -Semantik ähnlich zu sein (wenn auch nicht identisch), die unter implementiert wurde Ссылка

Sie sollten in der Lage sein, das an Ihre Bedürfnisse anzupassen oder zumindest einige Ideen daraus zu übernehmen.

    
Evan 28.04.2014 20:08
quelle
1

Sie sollten stattdessen ein map[string]interface{} verwenden, das viel schneller sein wird (obwohl immer noch nicht so schnell, wie Sie die richtige Logik mit tatsächlichen Strukturen verwendet haben).

%Vor%     
OneOfOne 28.04.2014 21:48
quelle
0

Verwenden Sie reflect.ValueOf (), es muss die Schnittstelle in den konkreten Typ konvertiert werden und SetXXX API , um den gewünschten Wert festzulegen.

%Vor%     
jtianling 23.11.2017 13:45
quelle

Tags und Links