Ich habe mehrere Strukturen mit demselben Format wie MapParameters
, die an die encodeParams
-Funktion übergeben werden. Leider führt die Verwendung dieser Funktion gegen diese Strukturen zu unerwünschter Kodierung, einschließlich des eingebetteten Strukturnamens. Kann ich das irgendwie reparieren, indem ich reflect
benutze, ohne eine riesige Switch-Bibliothek von Typ-Assertions zu verwenden?Golang - Eingebettete Struktur für URL-Kodierungsparameter ersetzen
// Desired Encoding
&required_param=1
// Current Encoding
%5BRequired%5D&required_param=1
// Desired
type MapParameters struct {
Required struct { ... }
Optional struct { ... }
}
// Current
type MapParameters struct {
MapRequired
MapOptional
}
type MapRequired struct { ... }
type MapOptional struct { ... }
func encodeParams(s string, opt interface{}) (string, error) {
v := reflect.ValueOf(opt)
if v.Kind() == reflect.Ptr && v.IsNil() {
return s, nil
}
u, err := url.Parse(s)
if err != nil {
return s, err
}
// from github.com/google/go-querystring/query
qs, err := query.Values(opt)
if err != nil {
return s, err
}
u.RawQuery = u.RawQuery + qs.Encode()
return u.String(), nil
}
sagen https://play.golang.org/p/6C8yUPu34E generieren URL-String "B = B & C = 2 & D = d & A = 1" in meinem Test-Projekt, so scheint es, dass Ihr Code funktionieren sollte. –
Ja, das ist mein aktueller Code. Ich würde es vorziehen, die Struktur ohne die extra deklarierte Struktur eingebettet zu haben. – pdago