我有多个结构,其格式与MapParameters
相同,传递给encodeParams
函数。不幸的是,对这些结构使用该函数会产生不需要的编码,包括嵌入的结构名称无论如何我可以使用reflect
解决这个问题而不使用断言类型的巨大切换库吗?
// 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 :(得分:0)
无论如何,如果您希望将匿名编码为嵌入式,请更改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
}
请注意sf.Anonymous
并非真正的匿名,它意味着嵌入评论说
type StructField struct {
...
Index []int // index sequence for Type.FieldByIndex
Anonymous bool // is an embedded field
}