多数据校验 - CheckStruct
CheckStruct
的使用方式同CheckMap
,除了第一个参数为struct类型
的结构体对象(也可以是对象指针)。但是需要注意的一个细节是,struct
的属性会有默认值
,在某些情况下会引起required
规则的失效,因此根据实际情况配合多种规则一起校验会是一个比较严谨的做法。
...
func CheckStruct(object interface{}, rules interface{}, msgs ...CustomMsg) *Error
示例1,使用map
指定规则及提示信息
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
func main() {
type Object struct {
Name string
Age int
}
rules := map[string]string {
"Name" : "required|length:6,16",
"Age" : "between:18,30",
}
msgs := map[string]interface{} {
"Name" : map[string]string {
"required" : "名称不能为空",
"length" : "名称长度为:min到:max个字符",
},
"Age" : "年龄为18到30周岁",
}
obj := Object{Name : "john"}
// 也可以是指针
// obj := &Object{Name : "john"}
if e := gvalid.CheckStruct(obj, rules,msgs); e != nil {
g.Dump(e.Maps())
}
}
/*
输出:
{
"Age": {
"between": "年龄为18到30周岁"
},
"Name": {
"length": "名称长度为6到16个字符"
}
}
*/
在以上示例中,Age
属性由于默认值0
的存在,因此会引起required
规则的失效,因此这里没有使用required
规则而是使用between
规则来进行校验。
示例2,使用gvalid tag
绑定规则及错误信息
使用gvalid tag
设置的规则,其校验结果是顺序性的。
...
{
"name": {
"length": "用户名称长度非法"
},
"password2": {
"password3": "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母、数字和特殊字符",
"same": "两次密码不一致,请重新输入"
},
"uid": {
"min": "字段最小值为1"
}
}
{
"name": {
"length": "用户名称长度非法"
},
"password2": {
"password3": "名称不能为空",
"same": "字段值不合法"
},
"uid": {
"min": "字段最小值为6"
}
}
示例3,属性递归校验
gvalid.CheckStruct
支持递归校验,即如果属性也是结构体,并且结构体的属性带有gvalid
标签,无论多深的递归层级,这些属性都将被根据设定的规则进行校验。
...
{
"password1": {
"same": "您两次输入的密码不一致"
},
"password2": {
"same": "您两次输入的密码不一致"
}
}
可选校验规则
当给定的数据校验规则中不包含required*
规则时,表示该规则不是一个必须规则,当属性值为nil
或者空字符串
时,将会忽略其校验。
示例1,空字符串
type Params struct {
Page int `v:"required|min:1 # page is required"`
Size int `v:"required|between:1,100 # size is required"`
ProjectId string `v:"between:1,10000 # project id must between :min, :max"`
}
obj := &Params{
Page: 1,
Size: 10,
}
err := gvalid.CheckStruct(obj, nil)
fmt.Println(err)
// Output:
// <nil>
示例2,空指针属性
type Params struct {
Page int `v:"required|min:1 # page is required"`
Size int `v:"required|between:1,100 # size is required"`
ProjectId *gvar.Var `v:"between:1,10000 # project id must between :min, :max"`
}
obj := &Params{
Page: 1,
Size: 10,
}
err := gvalid.CheckStruct(obj, nil)
fmt.Println(err)
// Output:
// <nil>
示例3,空整型属性
需要注意的是,如果键值为0
或者false
,将仍然会被校验。
...