多数据校验 - CheckStruct

    接口文档:https://godoc.org/github.com/gogf/gf/util/gvalid

    1. package main
    2. import (
    3. "github.com/gogf/gf/frame/g"
    4. "github.com/gogf/gf/util/gvalid"
    5. )
    6. func main() {
    7. type Object struct {
    8. Name string
    9. Age int
    10. }
    11. rules := map[string]string {
    12. "Name" : "required|length:6,16",
    13. "Age" : "between:18,30",
    14. }
    15. msgs := map[string]interface{} {
    16. "Name" : map[string]string {
    17. "required" : "名称不能为空",
    18. "length" : "名称长度为:min到:max个字符",
    19. },
    20. }
    21. obj := Object{Name : "john"}
    22. // 也可以是指针
    23. // obj := &Object{Name : "john"}
    24. if e := gvalid.CheckStruct(obj, rules,msgs); e != nil {
    25. g.Dump(e.Maps())
    26. }
    27. /*
    28. 输出:
    29. {
    30. "Age": {
    31. "between": "年龄为18到30周岁"
    32. },
    33. "Name": {
    34. "length": "名称长度为6到16个字符"
    35. }
    36. }
    37. */

    在以上示例中,Age属性由于默认值0的存在,因此会引起required规则的失效,因此这里没有使用required规则而是使用between规则来进行校验。

    使用gvalid tag设置的规则,其校验结果是顺序性的。

    可以看到,我们可以对在struct定义时使用了gvalid的标签属性(gvalid tag)来绑定校验的规则及错误提示信息,规则如下:

    1. [属性别名@]校验规则[#错误提示]

    可以看到,CheckStructCheckMapgvalid tag规则是一样的,不过在字段的含义上有一点点小区别:

    • 属性别名错误提示非必需字段校验规则必需字段
    • 属性别名 非必需字段,指定在校验中使用的对应struct属性的别名,同时校验成功后的map中的也将使用该别名返回,例如在处理请求表单时比较有用,因为表单的字段名称往往和的属性名称不一致;
    • 错误提示 非必需字段,表示自定义的错误提示信息,当规则校验时对默认的错误提示信息进行覆盖;

    在此示例代码中,same:password1规则同使用same:Pass2规则是一样的效果。也就是说,在数据校验中,可以同时使用原有的struct属性名称,也可以使用别名。但是,返回的结果中只会使用别名返回,这也是别名最大的用途。

    以上示例执行后,输出结果为:

    gvalid.CheckStruct支持递归校验,即如果属性也是结构体,并且结构体的属性带有gvalid标签,无论多深的递归层级,这些属性都将被根据设定的规则进行校验。

    使用示例:

    1. import (
    2. "github.com/gogf/gf/frame/g"
    3. "github.com/gogf/gf/util/gvalid"
    4. )
    5. func main() {
    6. type Pass struct {
    7. Pass1 string `valid:"password1@required|same:password2#请输入您的密码|您两次输入的密码不一致"`
    8. Pass2 string `valid:"password2@required|same:password1#请再次输入您的密码|您两次输入的密码不一致"`
    9. }
    10. type User struct {
    11. Id int
    12. Name string `valid:"name@required#请输入您的姓名"`
    13. Pass Pass
    14. }
    15. user := &User{
    16. Name: "john",
    17. Pass: Pass{
    18. Pass1: "1",
    19. Pass2: "2",
    20. },
    21. }
    22. err := gvalid.CheckStruct(user, nil)
    23. }