Struct默认值对required规则的影响

Struct的属性会有默认值,在某些情况下会引起required规则的失效。例如:

type User struct {
	Name string `v:"required"`
	Age  uint   `v:"required"`
}

在该结构体校验中,Age属性的required校验将会失效,因为Age即便没有输入也会有默认值0

这里有三种解决方案:

  1. 将属性改为指针类型,例如*int*float64*g.Var等,通过指针类型默认值为nil的特点绕过了这个问题。
  2. 使用组合校验规则来弥补默认值对required规则的影响,例如以上示例中将Age属性的校验规则修改为required|min:1将能达到业务校验的效果。
  3. 使用Struct校验的Assoc联合校验方法设置联合校验参数,在校验Struct类型参数时,参数值将以Assoc方法中给定的参数为准执行校验。如果使用框架的Server,采用结构化的API输入输出(XxxReq/XxxRes),那么Server将会自动调用Assoc执行校验,开发者无需担心默认值的影响。文档链接:Struct校验-Assoc关联


























Content Menu

  • No labels

5 Comments

  1. 请问struct校验支持嵌套吗?AppPageReq这个子struct里的EndTime,PageSize校验规则不生效。

    type AppPageReq struct {
    EndTime string `json:"endTime" in:"query" d:"1" v:"required|date-format:Y-m-d H:i:s.u#资讯截止时间,格式2021-06-04 17:42:06.467" dc:"资讯截止时间"`
    PageSize int `json:"pageSize" in:"query" d:"10" v:"max:500#分页数量最大500" dc:"分页数量,最大500"`
    }

    type NewsReq struct {
    g.Meta `path:"/get_important_news_list" method:"post" tags:"资讯" summary:"查询要闻列表"`
    UserId int `json:"userId" in:"query" d:"10" v:"min:1#用户id最小1" dc:"分页数量,最大500"`
    Ip string
    Params AppPageReq
    }
  2. 请问in:"header"为什么不生效,或者是 v:"required" in:"header"如何同时使用?

    我是指这样:

    type UserUpdateProfileReq struct {
    g.Meta `tag:"用户服务" summary:"更新头像、昵称" description:"用于更新用户信息:头像、昵称" mime:"multipart/form-data"`
    Authorization string `v:"required" in:"header" dc:"Authorization: Bearer eys...."`
    EncryptedData string `v:"required" dc:"用户信息加密字符串"`
    IV string `v:"required" dc:"用于解密用户加密信息"`
    }
    请求时,header中携带了Authorization字段,但参数校验依然会报缺少Authorization参数
    1. 郭强 刚接触这个框架, 大佬能否解答下呢?

  3. 验证没有返回出错的字段

  4. 试了一下,int类型的required也是可以生效了。没有传递id,会提示没有传递。


    type RoleDeleteReq struct {
    	g.Meta `path:"/role/delete" method:"delete" tags:"role" summary:"删除角色接口"`
    	Id     uint `v:"required"    dc:"角色id"`
    }


    {
        "code": 51,
        "message": "The Id field is required",
        "data": null
    }