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

时间:2016-05-04 04:15:14

标签: api go url-encoding

我有多个结构,其格式与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
}

1 个答案:

答案 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
}