我正在为一个项目编写一个后端,后端通过在请求主体中编码为json的POST请求接收用户数据。
我有两个结构:
在创建新帐户期间存储用户数据的结构:
type User struct {
Guid string ``
Name string `json:"Name"`
Pass string `json:"Pass"`
Username string `json:"Username"`
Email string `json:"Email"`
Phone string `json:"Phone"`
Country string `json:"Country"`
}
用于存储登录数据的结构
type Signin struct {
Username string `json:"Username"`
Pass string `json:"Pass"`
}
和json解码器功能(用于解码请求正文中的数据):
func extractAndAssignInfo(req *http.Request, dataStruct interface{}) interface{}{
decoder := json.NewDecoder(req.Body)
err := decoder.Decode(&dataStruct)
if err != nil {
log.Fatal(err)
}
return reflect.ValueOf(dataStruct).Interface()
}
是否可以使用extractAndAssignInfo()
函数来返回结构?
由于Guid是使用其他函数计算的,因此我尝试这样做
userdata := ExtractAndAssignInfo(req, User{})
该函数的返回值给出一种map[string]interface {}
的类型,如果我将返回类型更改为一个结构,那么它将不是可以解码并返回所需结构的“通用”函数。 / p>
我不确定这是否是解决问题的最佳方法。我还希望以其他任何方式在返回结构的同时重用相同的函数。
答案 0 :(得分:2)
使用此功能:
func extractAndAssignInfo(req *http.Request, v interface{}) {
decoder := json.NewDecoder(req.Body)
err := decoder.Decode(v)
if err != nil {
log.Fatal(err)
}
}
这样调用即可将请求解码为User
:
var userData User
extractAndAssignInfo(req, &userData)
并以此解码为Signin
:
var signin Signin
extractAndAssignInfo(req, &signin)
侧节点:对错误的请求数据退出流程不是一个好主意。考虑返回错误extractAndAssignInfo
而不是调用log.Fatal
。