Api Golang-取代URL编码参数的嵌入式结构
我有多个与Api Golang-取代URL编码参数的嵌入式结构,api,go,url-encoding,Api,Go,Url Encoding,我有多个与MapParameters格式相同的结构,它们被传递到encodeParams函数。不幸的是,对这些结构使用该函数会产生不需要的编码,包括嵌入的结构名称。我是否可以使用reflect来解决这个问题,而不必使用庞大的类型断言开关库 // Desired Encoding &required_param=1 // Current Encoding %5BRequired%5D&required_param=1 // Desired type MapParameters
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
}
匿名并不意味着嵌入,他们是完全不同的两件事。嵌入意味着嵌套结构的字段将呈现给外部结构。Anonymous只是缺少结构名称。您希望嵌入匿名结构,这不是一个好主意 无论如何,如果您希望将匿名编码为嵌入式,请更改
url encoding
lib中的代码
请注意,sf.Anonymous
并不是真正意义上的匿名,而是如评论所说的嵌入
type StructField struct {
...
Index []int // index sequence for Type.FieldByIndex
Anonymous bool // is an embedded field
}
匿名并不意味着嵌入,他们是完全不同的两件事。嵌入意味着嵌套结构的字段将呈现给外部结构。Anonymous只是缺少结构名称。您希望嵌入匿名结构,这不是一个好主意 无论如何,如果您希望将匿名编码为嵌入式,请更改
url encoding
lib中的代码
请注意,sf.Anonymous
并不是真正意义上的匿名,而是如评论所说的嵌入
type StructField struct {
...
Index []int // index sequence for Type.FieldByIndex
Anonymous bool // is an embedded field
}
在我的测试项目中生成url字符串
B=B&C=2&D=D&a=1
,因此您的代码应该可以工作。是的,这使用了我当前的代码。我更喜欢在没有额外声明的结构的情况下嵌入该结构。在我的测试项目中生成url字符串B=B&C=2&D=D&a=1
,因此您的代码应该可以工作。是的,这使用了我当前的代码。我更喜欢在没有额外声明的结构的情况下嵌入该结构。