In Go kann auf http-Formulardaten (z. B. von einer POST- oder PUT-Anforderung) als eine Karte der Form map[string][]string
zugegriffen werden. Es fällt mir schwer, dies auf verallgemeinerbare Weise in Strukturen umzuwandeln.
Ich möchte zum Beispiel eine Karte wie folgt laden:
%Vor%In ein Modell wie:
%Vor% Ich versuche also, eine Funktion mit der Signatur LoadModel(obj interface{}, m map[string][]string) []error
zu schreiben, die die Formulardaten in eine Schnittstelle {} lädt, die ich zurück in eine Person schreiben kann. Verwenden von Reflection, so dass ich es für jeden Strukturtyp mit beliebigen Feldern verwenden kann, nicht nur für eine Person, und so, dass ich den String nach Bedarf von den HTTP-Daten in ein int, boolean usw. konvertieren kann.
Mit der Antwort auf diese Frage in Golang, benutze reflect, wie stellst du den Wert eines struct-Feldes ein? Ich kann den Wert einer Person mit reflect setzen, zB:
%Vor%Aber dann müsste ich die Ladefunktion für jede Art von Struktur kopieren, die ich habe. Wenn ich es für eine Schnittstelle {} versuche, funktioniert es nicht.
%Vor%Wie kann ich das im allgemeinen Fall tun? Oder noch besser, gibt es einen idiomatischen Weg, um zu erreichen, was ich versuche zu tun?
Zum Spaß habe ich es ausprobiert. Beachten Sie, dass ich ein wenig betrog (siehe Kommentare), aber Sie sollten das Bild bekommen. Es gibt normalerweise Kosten für die Verwendung von Reflektion und statisch getippten Zuweisungen (wie die Antwort von nemo). Stellen Sie also sicher, dass Sie das bei Ihrer Entscheidung abwägen (ich habe es jedoch nicht bewertet).
Auch, offensichtlicher Disclaimer, habe ich nicht alle Randfälle usw. getestet usw. Kopieren Sie nicht einfach das im Produktionscode einfügen:)
Also hier geht es:
%Vor%Sie müssen Schalter für den allgemeinen Fall erstellen und die verschiedenen Feldtypen entsprechend laden. Dies ist ein grundlegender Teil.
Es wird schwieriger, wenn Sie Slices in der Struktur haben (dann müssen Sie sie auf die Anzahl der Elemente im Formularfeld laden), oder Sie haben verschachtelte Strukturen.
Ich habe ein Paket geschrieben, das das tut. Bitte sehen Sie:
Ich würde vorschlagen, eine bestimmte Schnittstelle anstelle von interface{}
in Ihrem LoadModel
zu verwenden.
welche Ihr Typ implementieren muss, um geladen zu werden.
Zum Beispiel:
%Vor% Und Ihr Person
implementiert Loadable
, indem es LoadModel
wie folgt implementiert:
So funktioniert beispielsweise das encoding/binary
-Paket oder das encoding/json
-Paket.
Tags und Links go