Ich versuche, eine generische Methode in Go zu erstellen, die eine struct
Verwendung von Daten aus a füllt map[string]interface{}
. Die Signatur und Verwendung der Methode könnte beispielsweise folgendermaßen aussehen:
func FillStruct(data map[string]interface{}, result interface{}) {
...
}
type MyStruct struct {
Name string
Age int64
}
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = 23
result := &MyStruct{}
FillStruct(myData, result)
// result now has Name set to "Tony" and Age set to 23
Ich weiß, dass dies mit JSON als Vermittler möglich ist. Gibt es eine andere effizientere Möglichkeit, dies zu tun?
encoding/json
Paket, um diesen Zwischenschritt auszuführen . Können Sie eine Beispielzuordnung und eine Beispielstruktur angeben, für die diese Methode verwendet werden könnte?unsafe
Paket geben ... aber ich wage es nicht, es zu versuchen. Davon abgesehen ist eine Reflexion erforderlich, da Sie in der Lage sein müssen, die einem Typ zugeordneten Metadaten abzufragen, um Daten in seine Eigenschaften einzufügen. Es wäre ziemlich einfach, dies injson.Marshal
+json.Decode
Anrufe einzuwickeln . Aber das ist doppelt so viel .Antworten:
Am einfachsten wäre es, https://github.com/mitchellh/mapstructure zu verwenden
Wenn Sie es selbst tun möchten, können Sie Folgendes tun:
http://play.golang.org/p/tN8mxT_V9h
quelle
func (s MyStr...) FillStruct ...
für jede definieren . Ist es möglich, FillStruct für eine Basisstruktur zu definieren, damit alle meine anderen Strukturen dieses Verhalten "erben"? Im obigen Paradigma ist dies nicht möglich, da nur die Basisstruktur ... in diesem Fall "MyStruct" tatsächlich die Felder iteriertDie https://github.com/mitchellh/mapstructure-Bibliothek von Hashicorp erledigt dies sofort :
Der zweite
result
Parameter muss eine Adresse der Struktur sein.quelle
user_name
und die Struktur abgelegt sindUserName
?encoding/json
Paketsnur zum Beispiel:
quelle
Sie können es tun ... es kann ein bisschen hässlich werden und Sie werden mit einigen Versuchen und Irrtümern in Bezug auf Zuordnungstypen konfrontiert sein ... aber hier ist das Wesentliche:
Arbeitsbeispiel: http://play.golang.org/p/PYHz63sbvL
quelle
reflect: call of reflect.Value.Set on zero Value
Ich passe Daves Antwort an und füge eine rekursive Funktion hinzu. Ich arbeite immer noch an einer benutzerfreundlicheren Version. Beispielsweise sollte eine Zahlenzeichenfolge in der Map in der Struktur in int konvertiert werden können.
quelle
Es gibt zwei Schritte:
Unten ist ein Beispiel:
quelle