动态地遍历结构中的每个字段并更改它们

时间:2018-06-14 18:05:19

标签: go struct

如何浏览struct中的所有字段并动态编辑/验证它们?

示例:

func UrlEncodeStruct(s interface{}) {
  r := reflect.ValueOf(obj)
  for i := 0; i < r.NumField(); i++ {
    value := r.Field(i).String()
    value = url.QueryEscape(value)
    r.Field(i).SetString(value)
  }
}

1 个答案:

答案 0 :(得分:3)

要修改调用者中的struct值,请更改函数以获取指向struct值的指针。否则,对于仅包含导出的字符串字段的结构,已发布的函数是正确的。

func UrlEncodeStruct(s interface{}) {
    r := reflect.ValueOf(s).Elem()  // <-- note call to Elem() here
    for i := 0; i < r.NumField(); i++ {
        value := r.Field(i).String()
        value = url.QueryEscape(value)
        r.Field(i).SetString(value)
    }
}

这样称呼:

var s someStructType
UrlEncodeStruct(&s)

playground example