在golang中,一般功能是将http表单数据加载到结构中

在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方式可以完成我想做的事情?


Cats萌萌
浏览 227回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go