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
,因此您的代码应该可以工作。是的,这使用了我当前的代码。我更喜欢在没有额外声明的结构的情况下嵌入该结构。