文章來源: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" : "字段值不合法", }