文章来源:http://gf.johng.cn/494378git
gf提供了很是强大易用的数据校验功能,经过gvalid包提供,封装了40种经常使用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验等特性。因为gf是模块化、低耦合设计,gvalid包也能够在项目中单独引入使用。shell
使用方式:json
import "gitee.com/johng/gf/g/util/gvalid"
40种经常使用的校验规则:数组
required 格式:required 说明:必需参数 required-if 格式:required-if:field,value,... 说明:必需参数(当任意所给定字段值与所给值相等时,即:当field字段的值为value时,当前验证字段为必须参数) required-unless 格式:required-unless:field,value,... 说明:必需参数(当所给定字段值与所给值都不相等时,即:当field字段的值不为value时,当前验证字段为必须参数) required-with 格式:required-with:field1,field2,... 说明:必需参数(当所给定任意字段值不为空时) required-with-all 格式:required-with-all:field1,field2,... 说明:必须参数(当所给定全部字段值都不为空时) required-without 格式:required-without:field1,field2,... 说明:必需参数(当所给定任意字段值为空时) required-without-all 格式:required-without-all:field1,field2,...说明:必须参数(当所给定全部字段值都为空时) date 格式:date 说明:参数为经常使用日期类型,格式:2006-01-02, 20060102, 2006.01.02 date-format 格式:date-format:format 说明:判断日期是否为指定的日期格式,format为Go日期格式(能够包含时间) email 格式:email 说明:EMAIL邮箱地址 phone 格式:phone 说明:手机号 telephone 格式:telephone 说明:国内座机电话号码,"XXXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"、"XXXXXXXX" passport 格式:passport 说明:通用账号规则(字母开头,只能包含字母、数字和下划线,长度在6~18之间) password 格式:password 说明:通用密码(任意可见字符,长度在6~18之间) password2 格式:password2 说明:中等强度密码(在弱密码的基础上,必须包含大小写字母和数字) password3 格式:password3 说明:强等强度密码(在弱密码的基础上,必须包含大小写字母、数字和特殊字符) postcode 格式:postcode 说明:中国邮政编码 id-number 格式:id-number 说明:公民身份证号码 qq 格式:qq 说明:腾讯QQ号码 ip 格式:ip 说明:IPv4/IPv6地址 ipv4 格式:ipv4 说明:IPv4地址 ipv6 格式:ipv6 说明:IPv6地址 mac 格式:mac 说明:MAC地址 url 格式:url 说明:URL domain 格式:domain 说明:域名 length 格式:length:min,max 说明:参数长度为min到max(长度参数为整形) min-length 格式:min-length:min 说明:参数长度最小为min(长度参数为整形) max-length 格式:max-length:max 说明:参数长度最大为max(长度参数为整形) between 格式:between:min,max 说明:参数大小为min到max(支持整形和浮点类型参数) min 格式:min:min 说明:参数最小为min(支持整形和浮点类型参数) max 格式:max:max 说明:参数最大为max(支持整形和浮点类型参数) json 格式:json 说明:判断数据格式为JSON integer 格式:integer 说明:整数 float 格式:float 说明:浮点数 boolean 格式:boolean 说明:布尔值(1,true,on,yes:true | 0,false,off,no,"":false) same 格式:same:field 说明:参数值必需与field参数的值相同 different 格式:different:field 说明:参数值不能与field参数的值相同 in 格式:in:value1,value2,... 说明:参数值应该在value1,value2,...中(字符串匹配) not-in 格式:not-in:value1,value2,... 说明:参数值不该该在value1,value2,...中(字符串匹配) regex 格式:regex:pattern 说明:参数值应当知足正则匹配规则pattern
校验方法列表:less
func Check(val interface{}, rules string, msgs interface{}, params ...map[string]interface{}) map[string]string func CheckMap(params map[string]interface{}, rules map[string]string, msgs ...map[string]interface{}) map[string]map[string]string func CheckObject(object interface{}, rules map[string]string, msgs ...map[string]interface{}) map[string]map[string]string func SetDefaultErrorMsgs(msgs map[string]string)
Check*方法只有在返回nil的状况下,表示数据校验成功,不然返回校验出错的数据项(CheckMap)以及对应的规则和错误信息的map,具体请查看后续示例代码才能更好理解。dom
下面咱们来举几个例子,看看如何使用gvalid来实现数据校验。模块化
一、校验数据长度,使用默认的错误提示post
rule := "length:6,16" if m := gvalid.Check("123456", rule); m != nil { fmt.Println(m) } if m := gvalid.Check("12345", rule); m != nil { fmt.Println(m) } // 输出: map[length:字段长度为6到16个字符]
二、校验数据类型及大小,而且使用自定义的错误提示ui
rule := "integer|between:6,16" msgs := "请输入一个整数|参数大小不对啊老铁" fmt.Println(gvalid.Check(5.66, rule, msgs)) // 输出: map[integer:请输入一个整数 between:参数大小不对啊老铁]
能够看到,多个规则以及多个自定义错误提示之间使用英文“|”号进行分割,注意自定义错误提示的顺序和多规则的顺序一一对应。msgs参数除了支持string类型之外,还支持map[string]string类型,请看如下例子:编码
rule := "url|min-length:11" msgs := map[string]string{ "url" : "请输入正确的URL地址", "minlength" : "地址长度至少为:min位" } fmt.Println(gvalid.Check("http://johngcn", rule, msgs)) // 输出: map[url:请输入正确的URL地址]
三、使用自定义正则校验数据格式,使用默认错误提示
// 参数长度至少为6个数字或者6个字母,可是总长度不能超过16个字符 rule := `regex:\d{6,}|\D{6,}|max-length:16` if m := gvalid.Check("123456", rule); m != nil { fmt.Println(m) } if m := gvalid.Check("abcde6", rule); m != nil { fmt.Println(m) } // 输出: map[regex:字段值不合法]
gvalid支持对多数据进行校验,支持map和struct类型,分别使用CheckMap和CheckObject方法实现。
一、多数据多规则校验,使用默认错误提示
params := map[string]interface{} { "passport" : "john", "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", } fmt.Println(gvalid.CheckMap(params, rules)) // 输出: map[passport:map[length:字段长度为6到16个字符] password:map[same:字段值不合法]]
二、多数据多规则校验,使用自定义错误提示
params := map[string]interface{} { "passport" : "john", "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" : "两次密码输入不相等", }, } fmt.Println(gvalid.CheckMap(params, rules, msgs)) // 输出: map[passport:map[length:帐号长度应当在6到16之间] password:map[same:两次密码输入不相等]]
该示例同时也展现了自定义错误传递的两种数据类型,string或者map[string]string。其中map[string]string类型参数须要指定对应字段、对应规则的错误提示信息,是一个二维的“关联数组”。
CheckObject的使用方式同CheckMap,除了第一个参数为struct类型的对象(也能够是对象指针)。可是须要注意的一个细节是,struct的属性会有默认值,所以某些状况下会引发required规则的失效,所以根据实际状况配合多种规则一块儿校验会是一个比较严谨的作法。
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"} fmt.Println(gvalid.CheckObject(obj, rules, msgs)) // 输出: map[Age:map[between:年龄为18到30周岁] Name:map[length:名称长度为6到16个字符]]
在以上示例中,Age属性因为默认值0的存在,所以会引发required规则的失效,所以这里没有使用required规则而是使用between规则来进行校验。
任什么时候候,咱们均可以经过gvalid.SetDefaultErrorMsgs方法来批量设置默认的错误提示信息(特别是针对多语言环境中),可是须要注意的是,修改是全局变化的,请注意可能会对其余模块校验信息的影响。一般建议为针对特定的校验单独配置不一样的校验错误提示信息。默认的错误提示以下:
var defaultMessages = map[string]string { "required" : "字段不能为空", "required-if" : "字段不能为空", "required-unless" : "字段不能为空", "required-with" : "字段不能为空", "required-with-all" : "字段不能为空", "required-without" : "字段不能为空", "required-without-all" : "字段不能为空", "date" : "日期格式不正确", "date-format" : "日期格式不正确", "email" : "邮箱地址格式不正确", "phone" : "手机号码格式不正确", "telephone" : "电话号码格式不正确", "passport" : "帐号格式不合法,必需以字母开头,只能包含字母、数字和下划线,长度在6~18之间", "password" : "密码格式不合法,密码格式为任意6-18位的可见字符", "password2" : "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母和数字", "password3" : "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母、数字和特殊字符", "postcode" : "邮政编码不正确", "id-number" : "身份证号码不正确", "qq" : "QQ号码格式不正确", "ip" : "IP地址格式不正确", "ipv4" : "IPv4地址格式不正确", "ipv6" : "IPv6地址格式不正确", "mac" : "MAC地址格式不正确", "url" : "URL地址格式不正确", "domain" : "域名格式不正确", "length" : "字段长度为:min到:max个字符", "min-length" : "字段最小长度为:min", "max-length" : "字段最大长度为:max", "between" : "字段大小为:min到:max", "min" : "字段最小值为:min", "max" : "字段最大值为:max", "json" : "字段应当为JSON格式", "xml" : "字段应当为XML格式", "array" : "字段应当为数组", "integer" : "字段应当为整数", "float" : "字段应当为浮点数", "boolean" : "字段应当为布尔值", "same" : "字段值不合法", "different" : "字段值不合法", "in" : "字段值不合法", "not-in" : "字段值不合法", "regex" : "字段值不合法", }