Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

多数据校验 - CheckMap

多数据校验即支持同时对多条数据进行校验,需要给定校验规则,并且可以自定义出错时的错误信息。 其中比较重要且复杂的是校验规则参数的定义。

...

  1. 其中params参数支持任意 map 数据类型;
  2. rules参数支持 []string / map[string]string 数据类型,前面一种类型支持返回校验结果顺序,后一种不支持(因为map是无序的);
  3. rules参数中的 map[string]string 是一个二维的关联数组/哈希表,第一维键名为参数键名,第二维为带有错误的校验规则名称,键值为错误信息;
  4. msgs参数为自定义的错误信息,为非必需参数,类型为CustomMsgmap[string]interface{})具体使用请参考后续示例;

示例1,默认错误提示

params := map[string]interface{} {
    "passport"  : "",
    "password"  : "123456",
    "password2" : "1234567",
}
rules := map[string]string {
    "passport"  : "required|length:6,16",
    "password"  : "required|length:6,16|same:password2",
    "password2" : "required|length:6,16",
}
if e := gvalid.CheckMap(params, rules); e != nil {
    fmt.Println(e.Maps())
}

// 输出: map[passport:map[required:字段不能为空 length:字段长度为6到16个字符] password:map[same:字段值不合法]]

示例2,自定义错误提示

params := map[string]interface{} {
    "passport"  : "",
    "password"  : "123456",
    "password2" : "1234567",
}
rules := map[string]string {
    "passport"  : "required|length:6,16",
    "password"  : "required|length:6,16|same:password2",
    "password2" : "required|length:6,16",
}
msgs  := map[string]interface{} {
    "passport" : "账号不能为空|账号长度应当在:min到:max之间",
    "password" : map[string]string {
        "required" : "密码不能为空",
        "same"     : "两次密码输入不相等",
    },
}
if e := gvalid.CheckMap(params, rules, msgs); e != nil {
    fmt.Println(e.String())
}

// 输出:账号不能为空; 账号长度应当在6到16之间; 两次密码输入不相等

该示例同时也展示了msgs自定义错误信息传递的两种数据类型,string或者map[string]string。其中map[string]string类型参数需要指定对应字段、对应规则的错误提示信息,是一个二维的“关联数组”。

校验结果顺序性

如果将上面的例2程序多执行几次之后会发现,返回的结果是没有排序的,而且字段及规则输出的先后顺序完全是随机的。即使我们使用FirstItem, FirstString()等其他方法获取校验结果也是一样,返回的校验结果不固定。

那是因为校验的规则我们传递的是map类型,而golangmap类型并不具有有序性,因此校验的结果和规则一样是随机的,同一个校验结果的同一个校验方法多次获取结果值返回的可能也不一样了。

使用gvalid tag顺序性校验

我们来改进一下以上的示例:校验结果中如果不满足required那么返回对应的错误信息,否则才是后续的校验错误信息;也就是说,返回的错误信息应当和我设定规则时的顺序一致。如下:

...

注意这里的gvalid tag与后续章节结构体校验中的属性别名不同,属性别名为非必需参数,这里的键名名称为必需参数,这样在校验时才能指定校验的参数名称。

可选校验规则

当给定的数据校验规则中不包含required*规则时,表示该规则不是一个必须规则,当键值为nil或者空字符串时,将会忽略其校验。我们将之前的例子改一下,去掉passport键名的required规则:

...