在Go中,http表单数据(例如来自POST或PUT请求的数据)可以作为表单的映射进行访问map[string][]string。我很难以通用的方式将其转换为结构。
例如,我要加载类似的地图:
m := map[string][]string {
"Age": []string{"20"},
"Name": []string{"John Smith"},
}
变成像这样的模型:
type Person struct {
Age int
Name string
}
因此,我试图编写一个带有签名的函数,该函数LoadModel(obj interface{}, m map[string][]string) []error会将表单数据加载到interface {}中,我可以将其类型转换回Person。使用反射,这样我就可以在具有任何字段的任何结构类型上使用它,而不仅是Person,而且可以根据需要将字符串从http数据转换为int,boolean等。
在golang中使用此问题的答案,在使用反射时,如何设置struct字段的值?我可以使用反射设置一个人的价值,例如:
p := Person{25, "John"}
reflect.ValueOf(&p).Elem().Field(1).SetString("Dave")
但是然后我必须为我拥有的每种类型的结构复制load函数。当我尝试将其用于接口{}时,它将无法正常工作。
pi := (interface{})(p)
reflect.ValueOf(&pi).Elem().Field(1).SetString("Dave")
// panic: reflect: call of reflect.Value.Field on interface Value
一般情况下我该怎么做?甚至更好的是,有没有一种更惯用的Go方式可以完成我想做的事情?
相关分类