gpt4 book ai didi

api - Golang - 取代 URL 编码参数的嵌入式结构

转载 作者:IT王子 更新时间:2023-10-29 02:23:14 29 4
gpt4 key购买 nike

我有多个结构,其格式与传递给 encodeParams 函数的 MapParameters 相同。不幸的是,对这些结构使用该函数会产生不需要的编码,包括嵌入的结构名称。无论如何,我可以使用 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
}

最佳答案

匿名并不意味着嵌入,它们是完全不同的两件事。嵌入意味着嵌套结构的字段将呈现给外部结构。匿名只是缺少结构名称。您期望嵌入匿名结构,这不是一个好主意。

无论如何,如果你想将匿名编码为嵌入式,请更改 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
}

关于api - Golang - 取代 URL 编码参数的嵌入式结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018339/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com