2016-05-04 19 views
1

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 
} 
+0

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. –

+0

Ja, das ist mein aktueller Code. Ich würde es vorziehen, die Struktur ohne die extra deklarierte Struktur eingebettet zu haben. – pdago

Antwort

0

Anonymous nicht meine Einbettung, sie sind völlig unterschiedlich zwei Sache. Einbetten bedeutet, dass die Felder der verschachtelten Struktur der äußeren Struktur angezeigt werden. Anonymous fehlt nur der Name der Struktur. Sie erwarten, dass anonyme Strukturen eingebettet werden, es ist keine gute Idee.

Wie auch immer, wenn Sie kodieren anonyme wollen als eingebettete, ändern Sie den Code in url-encoding lib https://github.com/google/go-querystring/blob/master/query/encode.go

if /*sf.Anonymous &&*/ sv.Kind() == reflect.Struct { 
    // save embedded struct for later processing 
    embedded = append(embedded, sv) 
    continue 
} 

Bitte beachten Sie sf.Anonymous nicht in Echt anonym bedeutet, bedeutet es, als Kommentar eingebettet

type StructField struct { 
    ... 
    Index  []int  // index sequence for Type.FieldByIndex 
    Anonymous bool  // is an embedded field 
}