in Golang, allgemeine Funktion zum Laden von http-Form-Daten in eine Struktur

7

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?

    
danny 15.10.2012, 23:56
quelle

3 Antworten

8

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%     
mna 16.10.2012, 02:16
quelle
8

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:

Ссылка

    
moraes 17.10.2012 09:05
quelle
7

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:

%Vor%

So funktioniert beispielsweise das encoding/binary -Paket oder das encoding/json -Paket.

    
nemo 16.10.2012 00:18
quelle

Tags und Links