多数据校验 - CheckStruct
接口文档:https://godoc.org/github.com/gogf/gf/util/gvalid
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个字符",
},
}
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
规则来进行校验。
使用gvalid tag
设置的规则,其校验结果是顺序性的。
可以看到,我们可以对在struct
定义时使用了gvalid
的标签属性(gvalid tag
)来绑定校验的规则及错误提示信息,规则如下:
[属性别名@]校验规则[#错误提示]
可以看到,CheckStruct
和CheckMap
的gvalid tag
规则是一样的,不过在字段的含义上有一点点小区别:
属性别名
和错误提示
为非必需字段,校验规则
是必需字段;属性别名
非必需字段,指定在校验中使用的对应struct
属性的别名,同时校验成功后的map
中的也将使用该别名返回,例如在处理请求表单时比较有用,因为表单的字段名称往往和的属性名称不一致;错误提示
非必需字段,表示自定义的错误提示信息,当规则校验时对默认的错误提示信息进行覆盖;
在此示例代码中,same:password1
规则同使用same:Pass2
规则是一样的效果。也就是说,在数据校验中,可以同时使用原有的struct
属性名称,也可以使用别名。但是,返回的结果中只会使用别名返回,这也是别名最大的用途。
以上示例执行后,输出结果为:
gvalid.CheckStruct
支持递归校验,即如果属性也是结构体,并且结构体的属性带有gvalid
标签,无论多深的递归层级,这些属性都将被根据设定的规则进行校验。
使用示例:
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
func main() {
type Pass struct {
Pass1 string `valid:"password1@required|same:password2#请输入您的密码|您两次输入的密码不一致"`
Pass2 string `valid:"password2@required|same:password1#请再次输入您的密码|您两次输入的密码不一致"`
}
type User struct {
Id int
Name string `valid:"name@required#请输入您的姓名"`
Pass Pass
}
user := &User{
Name: "john",
Pass: Pass{
Pass1: "1",
Pass2: "2",
},
}
err := gvalid.CheckStruct(user, nil)
}