作者:matrix
发布时间:2023-10-31
分类:Golang
验证器结构体的form标签中设置default即可,仅测试ShouldBindQuery有效读取,其他绑定方法未知
验证器结构体
type UserListValidator struct {
Type string `form:"type,default=RECOMMEND" binding:"omitempty,oneof=NEAR RECOMMEND" label:"列表类型"` //列表类型 NEAR:附近(默认) RECOMMEND:推荐
}
控制器方法
func (u *UserController) List(ctx *gin.Context) {
validator := validators.UserListValidator{}
if err := ctx.ShouldBindQuery(&validator); err != nil {
u.JSONResponseError(ctx, err)
return
}
//validator.Type
参考:
https://github.com/gin-gonic/gin/issues/1052#issuecomment-1609678741
https://www.vksir.zone/posts/go_struct_default/
作者:matrix
发布时间:2023-10-18
分类:Golang
json Merge Patch,是一个Internet Engineering Task Force(IETF)标准。基本思想是,你有一个原始的JSON对象,然后根据提供的“补丁”JSON对象,最终生成原始JSON对象需要修改的结果。这种机制适用于部分更新(也称为PATCH更新)的场景。
例子
原始对象:
{
"Account": "old_account",
"Name": "old_name",
"Avatar": "old_avatar"
}
补丁对象(patch object):
{
"Account": "new_account",
"Name": null
}
应用补丁对象后的待更新数据(PATCH更新):
{
"Account": "new_account",
"Avatar": "old_avatar"
}
简单来说,补丁对象(patch object)描述了以下几种修改:
golang使用
使用实现IETF标准的JSON Merge Patch依赖库 json-patch
go get -u github.com/evanphx/json-patch
// JOSN PATCH
// dst 原始对象
// patch 补丁对象
// return 将补丁应用到原始对象
func MergePatch(dst, patch interface{}) error {
// 序列化目标(原始)结构体到JSON
dstJSON, err := json.Marshal(dst)
if err != nil {
return err
}
// 序列化补丁结构体到JSON,这个补丁描述了如何修改目标(原始)对象
patchJSON, err := json.Marshal(patch)
if err != nil {
return err
}
// 使用补丁合并目标(原始)对象
mergedJSON, err := jsonpatch.MergePatch(dstJSON, patchJSON)
if err != nil {
return err
}
// 反序列化合并后的JSON回到目标(原始)结构体
return json.Unmarshal(mergedJSON, dst)
}
调用:
if err := MergePatch(&originJSON, &patchJSON); err != nil {
u.JSONResponseError(ctx, err)
return
}
// originJSON 就是应用过补丁的最新原始结构数据
参考:
https://datatracker.ietf.org/doc/html/rfc7396