json - 如何使用 golang 进行通用解码
问题描述
我见过一些看起来像这样的 go 代码:
type userForm struct {
Name string `json:"name" validate:"min=2"`
Surname string `json:"surname" validate:"min=2"`
Phone string `json:"phone" validate:"min=10"`
Email string `json:"email,omitempty" validate:"omitempty,email"`
}
type emailForm struct {
Email string `json:"email" validate:"email"`
}
func decodeUserForm(r *http.Request) (userForm, error) {
var body userForm
d := json.NewDecoder(r.Body)
if err := d.Decode(&body); err != nil {
return body, NewHTTPError(err, 400, "unable to decode user form")
}
return body, validateStruct(body)
}
func decodeEmailForm(r *http.Request) (emailForm, error) {
var body emailForm
d := json.NewDecoder(r.Body)
if err := d.Decode(&body); err != nil {
return body, NewHTTPError(err, 400, "unable to decode email form")
}
return body, validateStruct(body)
}
我发现两个功能是多余的。有没有更简单的方法将这两者合并成一个更通用的函数?围棋是好的做法吗?
解决方案
func decodeForm(r *http.Request, dst interface{}) error {
if err := json.NewDecoder(r.Body).Decode(dst); err != nil {
return NewHTTPError(err, 400, "unable to decode email form")
}
return validateStruct(dst)
}
然后像这样使用它:
var body emailForm
if err := decodeForm(r, &body); err != nil {
panic(err)
}
推荐阅读
- angular - 如何在 ReactiveForm 中获取所选选项的 id.value?
- javascript - 如何在 Material-ui 的 TableSortText 组件中自定义彩色文本和图标?
- angular - Angular - ts 文件中的 ngxTranslate
- docker - Docker 容器在 kubernetes 内工作/不工作
- python - Django 视图中的重复代码:如何避免重复?
- django - Django-Haystack clear_index 不删除数据库条目
- java - JDK 版本更改为 8 到 12 后,Converter/Formatted 方法无法正常工作
- android - 如何获得 viewImage 的 X 和 Y,当 viewImage1 具有与 imageView2 相同的 X 和 Y 时,它将消失
- python - 将带有不同键和键:值对的 json obj 转换为特定键的 python 列表:值
- html - 试图将切换按钮置于页面中心