Documentation ¶
Index ¶
- Constants
- Variables
- func CheckFieldIsStr(objName, fieldName string, tv reflect.Value) (err error)
- func Date(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Datetime(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Email(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Eq(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Float(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Ge(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func GenValidKV(key string, values ...string) string
- func GetDumpStructStr(v interface{}) string
- func GetDumpStructStrForJson(v interface{}) string
- func GetJoinFieldErr(objName, fieldName string, err interface{}) string
- func GetJoinValidErrStr(objName, fieldName, inputVal string, others ...string) string
- func GetOnlyExplainErr(errMsg string) string
- func GetTimeFmt(fmtType int8, splits ...string) (res string)
- func Gt(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func IDCard(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func In(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Include(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Int(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Ints(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Ip(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Ipv4(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Ipv6(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func IsExported(fieldName string) bool
- func JoinTag2Val(key string, values ...string) stringdeprecated
- func Json(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Le(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Lt(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Map(src interface{}, ruleObj RM) error
- func MapFn(src interface{}, ruleObj RM, fnMap Name2FnMap) error
- func NestedStructForRule(src interface{}, ruleMap map[interface{}]RM) error
- func NewDumpStruct() *dumpStruct
- func NoEq(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func OTo(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func ParseValidNameKV(validName string) (key, value, cusMsg string)
- func Phone(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Prefix(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Re(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func ReflectKindIsNum(kind reflect.Kind, isCanFloat ...bool) (is bool)
- func RemoveTypePtr(t reflect.Type) reflect.Type
- func RemoveValuePtr(t reflect.Value) reflect.Value
- func SetCustomerValidFn(validName string, fn CommonValidFn)
- func SetStructTypeCache(cacheEr CacheEr)
- func StrEscape(val string) string
- func Struct(src interface{}, ruleObj ...RM) error
- func StructForFn(src interface{}, ruleObj RM, targetTag ...string) error
- func StructForFns(src interface{}, ruleObj RM, fnMap Name2FnMap, targetTag ...string) error
- func Suffix(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func To(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func ToStr(src interface{}) string
- func Unique(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Url(src interface{}, ruleObj RM) error
- func UrlForFn(src interface{}, validName string, validFn CommonValidFn) error
- func ValidNamesSplit(s string, sep ...byte) []string
- func ValidStructForMyValidFn(src interface{}, validName string, validFn CommonValidFn, targetTag ...string) errordeprecated
- func ValidStructForRule(ruleObj RM, src interface{}, targetTag ...string) errordeprecated
- func ValidateStruct(src interface{}, targetTag ...string) errordeprecated
- func Var(src interface{}, rules ...string) error
- func VarForFn(src interface{}, validFn CommonValidFn) error
- func Year(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- func Year2Month(errBuf *strings.Builder, validName, objName, fieldName string, ...)
- type CacheEr
- type CommonValidFn
- type LRUCache
- type Name2FnMap
- type RM
- type VMap
- type VStruct
- type VUrl
- type VVar
Examples ¶
Constants ¶
const ( ExplainEn = "explain:" ExplainZh = "说明:" )
err msg
const ( YearFmt int8 = 1 << iota MonthFmt DayFmt HourFmt MinFmt SecFmt DateFmt = YearFmt | MonthFmt | DayFmt DateTimeFmt = DateFmt | HourFmt | MinFmt | SecFmt )
时间格式
const ( Required = "required" // 必填 Exist = "exist" // 有值才验证 Either = "either" // 多个必须一个 BothEq = "botheq" // 两者相等 VTo = "to" // 两者之间, 闭区间 VGe = "ge" // 大于或等于 VLe = "le" // 小于或等于 VOTo = "oto" // 两者之间, 开区间 VGt = "gt" // 大于 VLt = "lt" // 小于 VEq = "eq" // 等于 VNoEq = "noeq" // 不等于 VIn = "in" // 指定输入选项 VInclude = "include" // 指定输入包含选项 VPhone = "phone" // 手机号 VEmail = "email" // 邮箱 VIDCard = "idcard" // 身份证号码 VYear = "year" // 年 VYear2Month = "year2month" // 年月 VDate = "date" // 日 VDatetime = "datetime" // 日期+时间点 VInt = "int" // 整数 VInts = "ints" // 多个数字验证 VFloat = "float" // 浮动数 VRe = "re" // 正则 VIp = "ip" // ip VIpv4 = "ipv4" // ipv4 VIpv6 = "ipv6" // ipv6 VUnique = "unique" // 唯一验证 VJson = "json" // json 格式验证 VPrefix = "prefix" // 包含前缀 VSuffix = "suffix" // 包含后缀 )
验证 tag
Variables ¶
var ( IncludeZhRe = regexp.MustCompile("[\u4e00-\u9fa5]") // 中文 PhoneRe = regexp.MustCompile(`^1[3,4,5,6,7,8,9]\d{9}$`) // 手机号 Ipv4Re = regexp.MustCompile(`^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$`) EmailRe = regexp.MustCompile(`^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$`) IdCardRe = regexp.MustCompile(`(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)`) IntRe = regexp.MustCompile(`^\d+$`) FloatRe = regexp.MustCompile(`^\d+.\d+$`) // Deprecated YearRe = regexp.MustCompile(`^\d{4}$`) // Deprecated Year2MonthRe = regexp.MustCompile(`^\d{4}-\d{2}$`) // Deprecated Year2MonthRe2 = regexp.MustCompile(`^\d{4}/\d{2}$`) // Deprecated DateRe = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`) // Deprecated DateRe2 = regexp.MustCompile(`^\d{4}/\d{2}/\d{2}$`) // Deprecated DatetimeRe = regexp.MustCompile(`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$`) // Deprecated DatetimeRe2 = regexp.MustCompile(`^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}$`) )
正则
var (
ErrEndFlag = "; " // 错误结束符号(每个自定义 err 都需要将这个追加在后面, 用于分句)
)
标记
Functions ¶
func CheckFieldIsStr ¶ added in v1.4.8
CheckFieldIsStr 验证字段类型是否为字符串
func Date ¶
Date 验证日期 默认匹配 xxxx-xx-xx, 可以指定分割符
Example ¶
type Tmp struct { Year string `valid:"year"` Year2Month string `valid:"year2month=/"` Date string `valid:"date=/"` Date2 string `valid:"date=''"` Datetime string `valid:"datetime|应该为 xxxx-xx-xx xx:xx:xx 的时间格式"` } v := &Tmp{Year: "2001", Year2Month: "2000/01", Date: "2021/01/22", Date2: "20210122", Datetime: "2021-01-11 23:22"} fmt.Println(Struct(v))
Output: "Tmp.Datetime" input "2021-01-11 23:22", 说明: 应该为 xxxx-xx-xx xx:xx:xx 的时间格式
func Datetime ¶
Datetime 验证时间 默认匹配 xxxx-xx-xx xx:xx:xx, 可以指定分割符
Example ¶
type Tmp struct { Datetime1 string `valid:"required,datetime|应该为 xxxx-xx-xx xx:xx:xx 的时间格式"` Datetime2 string `valid:"required,datetime='/'|应该为 xxxx/xx/xx xx:xx:xx 的时间格式"` Datetime3 string `valid:"required,datetime='/, ,/'|应该为 xxxx/xx/xx xx/xx/xx 的时间格式"` Datetime4 string `valid:"required,datetime=', ,'|应该为 xxxxxxxx xxxxxx 的时间格式"` Datetime5 string `valid:"required,datetime=',,'|应该为 xxxxxxxxxxxxxx 的时间格式"` } v := &Tmp{ Datetime1: "2022/11-09 10:05:00", Datetime2: "2022/11/09 10:05:00", Datetime3: "2022/11/09 10/05/00", Datetime4: "20221109 100500", Datetime5: "20221109100500", } fmt.Println(Struct(v))
Output: "Tmp.Datetime1" input "2022/11-09 10:05:00", 说明: 应该为 xxxx-xx-xx xx:xx:xx 的时间格式
func Email ¶
Email 验证邮箱
Example ¶
type Tmp struct { Email string `valid:"email"` } v := &Tmp{Email: "xuesongtao512qq.com"} fmt.Println(Struct(v))
Output: "Tmp.Email" input "xuesongtao512qq.com", explain: it is not email
func Eq ¶
Eq 等于验证 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"required,eq=3"` Age int32 `valid:"required,eq=20|年龄应该等于 20"` Score float64 `valid:"eq=80"` Phone string `valid:"eq=11"` } v := &Tmp{ Name: "xue", Age: 21, Score: 80, Phone: "1354004261", } fmt.Println(Struct(v))
Output: "Tmp.Age" input "21", 说明: 年龄应该等于 20; "Tmp.Phone" input "1354004261", explain: it should equal 11 str-length
func Float ¶
Float 验证浮动数
Example ¶
type Tmp struct { FloatString string `valid:"float|请输入浮点数"` FloatNum32 float32 `valid:"float"` FloatNum64 float64 `valid:"float"` } v := &Tmp{ FloatString: "1", FloatNum32: 12.5, FloatNum64: 1.0, } fmt.Println(Struct(v))
Output: "Tmp.FloatString" input "1", 说明: 请输入浮点数
func Ge ¶
Ge 大于或等于验证 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"ge=1"` Age int32 `valid:"ge=0|应该大于 0"` } v := &Tmp{Name: "测试调", Age: -1} fmt.Println(Struct(v))
Output: "Tmp.Age" input "-1", 说明: 应该大于 0
func GenValidKV ¶ added in v1.5.23
GenValidKV 生成 defaultTargetTag 的值 说明: 函数名主要用于生成(如: `valid:"xxx"`) 中 "xxx" 的部分 key 为验证规则 values[0] 会被解析为值 values[1] 会被解析为自定义错误信息 如1.: GenValidKV(VTo, "1~10", "需要在 1-10 的区间") => to=1~10|需要在 1-10 的区间
如2: GenValidKV(VRe, "\\d+", "必须为纯数字") => re='\\d+'|必须为纯数字
func GetDumpStructStr ¶ added in v1.3.9
func GetDumpStructStr(v interface{}) string
GetDumpStructStr 获取待 dump 的结构体字符串, 支持 json 格式化 只会把字段名解析成 key, 值为 value GetDumpStructStrForJson 性能较好, 只是在有 json_tag 的时候会用 json_tag 作为 key
func GetDumpStructStrForJson ¶ added in v1.3.9
func GetDumpStructStrForJson(v interface{}) string
GetDumpStructStrForJson 先 json 序列化, 再获取
func GetJoinFieldErr ¶ added in v1.5.23
GetJoinFieldErr 拼接字段错误
func GetJoinValidErrStr ¶ added in v1.3.5
GetJoinValidErrStr 获取拼接验证的错误消息, 内容直接通过空格隔开, 最后会拼接 ErrEndFlag
func GetOnlyExplainErr ¶ added in v1.6.6
GetOnlyExplainErr 获取所有的说明错误(不包含错误的字段信息) 使用场景: 在自定义错误信息时, 返回给非开发人员看的结果
Example ¶
type Tmp struct { Name string `valid:"to=2~4|姓名长度应该在2-4个长度"` IntString string `valid:"int|IntString请输入整数类"` IntNum string `valid:"int|IntNum请输入整数"` } v := &Tmp{ Name: "xuesongtao", IntString: "11.121", IntNum: "1a", } err := Struct(&v) fmt.Println(GetOnlyExplainErr(err.Error()))
Output: 姓名长度应该在2-4个长度; IntString请输入整数类; IntNum请输入整数
func GetTimeFmt ¶ added in v1.6.9
GetTimeFmt 获取时间格式化 splits 为分隔符 splits[0] 为 [年月日] 的分割符, 默认为 "-" splits[1] 为 [年月日] 和 [时分秒] 的分割符, 默认为 " " splits[2] 为 [时分秒] 的分割符, 默认为 ":"
func Gt ¶
Gt 大于验证 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"gt=2"` Age int32 `valid:"gt=0"` } v := &Tmp{Name: "测试", Age: -1} fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试", explain: it is less than or equal 2 str-length; "Tmp.Age" input "-1", explain: it is less than or equal 0 num-size
func IDCard ¶
IDCard 验证身份证
Example ¶
type Tmp struct { IDCard string `valid:"idcard"` } v := &Tmp{IDCard: "511321"} fmt.Println(Struct(v))
Output: "Tmp.IDCard" input "511321", explain: it is not idcard
func In ¶
In 指定输入选项(精准匹配)
Example ¶
type Tmp struct { SelectNum int32 `valid:"in=(1/2/3/4)"` SelectStr string `valid:"in=(a/b/c/d)|应该在 a/b/c/d 里选择"` } v := &Tmp{SelectNum: 1, SelectStr: "ac"} fmt.Println(Struct(v))
Output: "Tmp.SelectStr" input "ac", 说明: 应该在 a/b/c/d 里选择
func Include ¶ added in v1.3.2
Include 指定包含什么字符串(模糊匹配)
Example ¶
type Tmp struct { SelectStr string `valid:"include=(hello/test)"` } v := &Tmp{SelectStr: "hel"} fmt.Println(Struct(v))
Output: "Tmp.SelectStr" input "hel", explain: it should include (hello/test)
func Int ¶
Int 验证整数
Example ¶
type Tmp struct { IntString string `valid:"int|请输入整数类"` IntNum int `valid:"int"` } v := &Tmp{ IntString: "11.121", IntNum: 1, } fmt.Println(Struct(&v))
Output: "Tmp.IntString" input "11.121", 说明: 请输入整数类
func Ints ¶ added in v1.5.23
Ints 验证是否为多个数字 1. 如果输入为 string, 默认按逗号拼接进行处理 2. 如果为 slice/array, 会将每个值进行匹配判断
Example ¶
type Tmp struct { IntStr string `valid:"ints"` IntStr1 string `valid:"ints=-"` IntSlice []int `valid:"ints"` IntSliceStr []string `valid:"ints"` } v := &Tmp{ IntStr: "1,2,3", IntStr1: "1,2,3", IntSliceStr: []string{"1", "hello"}, IntSlice: []int{1, 2}, } fmt.Println(Struct(&v))
Output: "Tmp.IntStr1" input "1,2,3", explain: it is not separated by "-" num; "Tmp.IntSliceStr" input "[1, hello]", explain: slice/array element is not all num
func Ip ¶ added in v1.6.9
Ip ip 验证
Example ¶
type Tmp struct { Ip string `valid:"required,ip|ip不正确"` Ipv4 string `valid:"required,ipv4|ipv4不正确"` Ipv6 string `valid:"required,ipv6|ipv6不正确"` } v := &Tmp{ Ip: "192.168.1.0", Ipv4: "192.168.0.113", Ipv6: "2001:3CA1:10F:1A:121B:0:0:", } fmt.Println(Struct(&v))
Output: "Tmp.Ipv6" input "2001:3CA1:10F:1A:121B:0:0:", 说明: ipv6不正确
func JoinTag2Val
deprecated
added in
v1.5.23
func Json ¶ added in v1.6.10
Json 验证是否为 json
Example ¶
type Tmp struct { Name string `valid:"required"` Json1 string `valid:"required,json|json格式不正确"` Json2 string `valid:"required,json"` } tmp := &Tmp{ Name: "测试json", Json1: `[{"id":1,"name":"test","age":10,"cls_name":"初一","addr":"四川成都"},{"id":2,"name":"test","age":10,"cls_name":"初二","addr":"四川成都"}]`, Json2: `{"name":"A-Tao","hobby":["play basketball","write golang code"],"class_name":"community university","addr":"ChengDu"}`, } err := Struct(tmp) fmt.Println(err)
Output: <nil>
func Le ¶
Le 小于或等于验证 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"le=2"` Age int32 `valid:"le=0"` } v := &Tmp{Name: "测试调", Age: 1} fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试调", explain: it is more than 2 str-length; "Tmp.Age" input "1", explain: it is more than 0 num-size
func Lt ¶
Lt 小于验证, 如果为字符串则是验证字符个数, 如果是数字的话就验证数字的大小
Example ¶
type Tmp struct { Name string `valid:"lt=2"` Age int32 `valid:"lt=40"` } v := &Tmp{Name: "测试", Age: 99} fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试", explain: it is more than or equal 2 str-length; "Tmp.Age" input "99", explain: it is more than or equal 40 num-size
func MapFn ¶ added in v1.6.10
func MapFn(src interface{}, ruleObj RM, fnMap Name2FnMap) error
MapFn 验证 map
func NestedStructForRule ¶ added in v1.6.10
NestedStructForRule 结构嵌套多个设置多个结构体规则 ruleMap key: 结构体指针, value: RM 注: ruleMap 的 key 必须为指针, 不然会报错 "hash of unhashable type"
Example ¶
type Tmp1 struct { Name string } type Tmp struct { Ip string T []Tmp1 } rmap := map[interface{}]RM{ // key 必须为 指针 &Tmp{}: NewRule().Set("Ip,T", Required).Set("Ip", GenValidKV(VIp, "", "ip 格式不正确")), &Tmp1{}: NewRule().Set("Name", GenValidKV(Required, "", "姓名必填")), } v := &Tmp{ Ip: "256.12.22.400", T: []Tmp1{{Name: ""}, {Name: "2"}}, } err := NestedStructForRule(v, rmap) fmt.Println(err)
Output: "Tmp.Ip" input "256.12.22.400", 说明: ip 格式不正确; "Tmp.T[0].Name" input "", 说明: 姓名必填
func NoEq ¶ added in v1.4.2
NoEq 不等于验证 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"required,noeq=3"` Age int32 `valid:"required,noeq=20|年龄不应该等于 20"` Score float64 `valid:"noeq=80"` Phone string `valid:"noeq=11"` } v := &Tmp{ Name: "xue", Age: 20, Score: 80, Phone: "1354004261", } fmt.Println(Struct(v))
Output: "Tmp.Name" input "xue", explain: it is not equal 3 str-length; "Tmp.Age" input "20", 说明: 年龄不应该等于 20; "Tmp.Score" input "80", explain: it is not equal 80 num-size
func OTo ¶
OTo 验证输入的大小区间, 注: 左右都为开区间 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"oto=1~3"` Age int32 `valid:"oto=1~100"` NickName string `valid:"oto=0~10"` Addr string `valid:"oto=1~3|家庭地址长度应该在 大于 1 且小于 3"` } v := &Tmp{Name: "测试", Age: 0, NickName: "h1", Addr: "tet"} fmt.Println(Struct(v))
Output: "Tmp.Addr" input "tet", 说明: 家庭地址长度应该在 大于 1 且小于 3
func ParseValidNameKV ¶
ParseValidNameKV 解析 validName 中的 key, value 和 cusMsg, 如: "required|必填", key 为 "required", value 为 "", cusMsg 为 "必填" 如: "to=1~2|大于等于 1 且小于等于 2", key 为 "to", value 为 "1~2", cusMsg 为 "大于等于 1 且小于等于 2"
func Phone ¶
Phone 验证手机号
Example ¶
type Tmp struct { Phone string `valid:"phone"` } v := &Tmp{Phone: "1"} fmt.Println(Struct(v))
Output: "Tmp.Phone" input "1", explain: it is not phone
func Prefix ¶ added in v1.6.10
Prefix 验证字符串包含前缀
Example ¶
type Tmp struct { Name string `valid:"required,prefix=test|前缀必须为test"` } tmp := &Tmp{ Name: "ceshi", } err := Struct(tmp) fmt.Println(err)
Output: "Tmp.Name" input "ceshi", 说明: 前缀必须为test
func Re ¶ added in v1.5.17
Re 正则表达式 使用格式如: re='\\d+'|匹配错误
Example ¶
type Tmp struct { Name string `valid:"required|必填,re='[a-z]+'|姓名必须为英文"` Age string `valid:"re='\\d{2}'|年龄必须为 2 位数"` Addr string `valid:"required|地址必须,re='[\u4e00-\u9fa5]'|地址必须为中文"` Pwd string `valid:"required,re='^[A-Za-z0-9]{8,16}$'|密码必须为8-16为字母和数字组合"` } v := &Tmp{ Name: "测试", Age: "1", Addr: "四川成都", Pwd: "1234567", } fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试", 说明: 姓名必须为英文; "Tmp.Age" input "1", 说明: 年龄必须为 2 位数; "Tmp.Pwd" input "1234567", 说明: 密码必须为8-16为字母和数字组合
func ReflectKindIsNum ¶ added in v1.5.23
ReflectKindIsNum 值是否为数字
func RemoveTypePtr ¶ added in v1.5.17
RemoveTypePtr 移除多指针
func RemoveValuePtr ¶ added in v1.5.17
RemoveValuePtr 移除多指针
func SetCustomerValidFn ¶
func SetCustomerValidFn(validName string, fn CommonValidFn)
SetCustomerValidFn 自定义验证函数 用于全局添加验证方法, 如果不想定义全局, 可根据验证对象分别调用 SetValidFn, 如: *VStruct.SetValidFn
Example ¶
type Tmp struct { Name string `valid:"required"` Age string `valid:"num"` } isNumFn := func(errBuf *strings.Builder, validName, structName, fieldName string, tv reflect.Value) { ok, _ := regexp.MatchString("^\\d+$", tv.String()) if !ok { errBuf.WriteString(fmt.Sprintf("%q is not num", structName+"."+fieldName)) return } } SetCustomerValidFn("num", isNumFn) v := Tmp{Name: "12", Age: "1ha"} fmt.Println(Struct(&v))
Output: "Tmp.Age" is not num
func SetStructTypeCache ¶ added in v1.6.5
func SetStructTypeCache(cacheEr CacheEr)
SetStructTypeCache 设置 structType 缓存类型
func Struct ¶ added in v1.5.27
Struct 验证结构体 1. 支持单结构体验证 2. 支持切片/数组类型结构体验证 3. 支持map: key为普通类型, value为结构体 验证
func StructForFn ¶ added in v1.5.29
StructForFn 验证结构体, 同时设置自定义参数
func StructForFns ¶ added in v1.6.10
func StructForFns(src interface{}, ruleObj RM, fnMap Name2FnMap, targetTag ...string) error
StructForFns 验证结构体, 可以设置自定义验证函数和规则
Example ¶
type Tmp struct { Name string Addr string } isLower := func(errBuf *strings.Builder, validName, objName, fieldName string, tv reflect.Value) { if err := CheckFieldIsStr(objName, fieldName, tv); err != nil { errBuf.WriteString(err.Error()) return } if strings.ToLower(tv.String()) != tv.String() { errBuf.WriteString(GetJoinValidErrStr(objName, fieldName, tv.String(), ExplainEn, "it is not lower")) } } isZh := func(errBuf *strings.Builder, validName, objName, fieldName string, tv reflect.Value) { if err := CheckFieldIsStr(objName, fieldName, tv); err != nil { errBuf.WriteString(err.Error()) return } if match, _ := regexp.MatchString("^[\u4e00-\u9fa5]+$", tv.String()); !match { errBuf.WriteString(GetJoinValidErrStr(objName, fieldName, tv.String(), ExplainEn, "it should is zh")) } } fnMap := Name2FnMap{"islower": isLower, "iszh": isZh} rm := RM{"Name": "islower", "Addr": "iszh"} v := &Tmp{ Name: "Test", Addr: "四川", } err := StructForFns(v, rm, fnMap) fmt.Println(err)
Output: "Tmp.Name" input "Test", explain: it is not lower
func Suffix ¶ added in v1.6.10
Suffix 验证字符串包含后缀
Example ¶
type Tmp struct { Name string `valid:"required,suffix=test|后缀必须为test"` } tmp := &Tmp{ Name: "mytest", } err := Struct(tmp) fmt.Println(err)
Output: <nil>
func To ¶
To 验证输入的大小区间, 注: 左右都为闭区间 1. 如果为字符串则是验证字符个数 2. 如果是数字的话就验证数字的大小 3. 如果是切片的话就验证的长度
Example ¶
type Tmp struct { Name string `valid:"to=1~3|姓名长度为 1-3 个字符"` Age int32 `valid:"to=0~99|年龄应该在 0-99 之间"` Addr string `valid:"to=3~10"` } v := &Tmp{Name: "测试调1", Age: 100, Addr: "tets"} fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试调1", 说明: 姓名长度为 1-3 个字符; "Tmp.Age" input "100", 说明: 年龄应该在 0-99 之间
func Unique ¶ added in v1.5.27
Unique 对集合字段进行唯一验证 1. 对以逗号隔开的字符串进行唯一验证 2. 对切片/数组元素[int 系列, float系列, bool系列, string系列]进行唯一验证
Example ¶
type Tmp struct { Name string `valid:"required|必填,re='[a-z]+'|姓名必须为英文"` Hobby string `valid:"required|必填,unique|爱好唯一"` ClassName []string `valid:"required|必填,unique|班级名唯一"` LikeNum []int `valid:"required|必填,unique|幸运数唯一"` } v := &Tmp{ Name: "测试", Hobby: "打篮球,踢足球,打篮球", ClassName: []string{"美术班", "算术班", "足球班"}, LikeNum: []int{1, 2, 3, 1}, } fmt.Println(Struct(v))
Output: "Tmp.Name" input "测试", 说明: 姓名必须为英文; "Tmp.Hobby" input "打篮球,踢足球,打篮球", 说明: 爱好唯一; "Tmp.LikeNum" input "[1,2,3,1]", 说明: 幸运数唯一
func Url ¶ added in v1.5.29
Url 验证变量
Example ¶
url := "http://test.com?name=test&age=10&nickname=test1" ruleObj := NewRule() ruleObj.Set("name", Required, GenValidKV(VTo, "5~10|姓名需在5-10之间"), GenValidKV(BothEq, "botheq=0")) ruleObj.Set("nickname", Required, GenValidKV(BothEq, "botheq=0")) err := Url(url, ruleObj) fmt.Println(err)
Output: "name" input "test", 说明: 姓名需在5-10之间; "name", "nickname" explain: they should be equal
func UrlForFn ¶ added in v1.5.29
func UrlForFn(src interface{}, validName string, validFn CommonValidFn) error
UrlForFn 验证 url, 同时设置自定义函数
func ValidNamesSplit ¶ added in v1.6.1
ValidNamesSplit 验证点进行分割
func ValidStructForMyValidFn
deprecated
added in
v1.4.4
func ValidStructForMyValidFn(src interface{}, validName string, validFn CommonValidFn, targetTag ...string) error
Deprecated: 使用 StructForFns 替换 ValidStructForMyValidFn 自定义单个验证函数
Example ¶
type Tmp struct { Name string `valid:"required"` Age string `valid:"num"` } isNumFn := func(errBuf *strings.Builder, validName, structName, fieldName string, tv reflect.Value) { ok, _ := regexp.MatchString("^\\d+$", tv.String()) if !ok { errBuf.WriteString(fmt.Sprintf("%q is not num", structName+"."+fieldName)) return } } v := Tmp{Name: "12", Age: "1ha"} fmt.Println(ValidStructForMyValidFn(v, "num", isNumFn))
Output: "Tmp.Age" is not num
func ValidStructForRule
deprecated
Deprecated: 使用 StructForFn 替换 ValidStructForRule 自定义验证规则并验证 注: 通过字段名来匹配规则, 如果嵌套中如果有相同的名的都会走这个规则, 因此建议这种方式推荐使用非嵌套结构体
Example ¶
type Tmp struct { Name string Age int } v := Tmp{Name: "xue", Age: 101} ruleObj := NewRule() if v.Name == "xue" { // "required|必填,le=100|年龄最大为 100" ruleObj.Set("Age", JoinTag2Val(Required, "", "必填"), JoinTag2Val(VLe, "100", "年龄最大为 100")) } if err := ValidStructForRule(ruleObj, &v); err != nil { fmt.Println(err) }
Output: "Tmp.Age" input "101", 说明: 年龄最大为 100
func ValidateStruct
deprecated
func Var ¶ added in v1.5.27
Var 验证变量 支持 单个 [int,float,bool,string] 验证 支持 切片/数组 [int,float,bool,string] 验证时会对对象中的每个值进行验证
Example ¶
err := Var(101, Required, GenValidKV(VTo, "1~100", "年龄1~100")) fmt.Println(err)
Output: input "101", 说明: 年龄1~100
func VarForFn ¶ added in v1.5.29
func VarForFn(src interface{}, validFn CommonValidFn) error
VarForFn 验证变量, 同时设置自定义函数
Types ¶
type CacheEr ¶ added in v1.6.5
type CacheEr interface { Load(key interface{}) (interface{}, bool) Store(key, value interface{}) }
CacheEr 缓存接口
type CommonValidFn ¶ added in v1.4.4
type CommonValidFn func(errBuf *strings.Builder, validName, objName, fieldName string, tv reflect.Value)
CommonValidFn 通用验证函数, 主要用于回调 注: 在写 errBuf 的时候建议用 GetJoinValidErrStr 包裹下, 这样产生的结果易读.
否则需要再 errBuf.WriteString 最后要加上 ErrEndFlag 分割, 工具是通过 ErrEndFlag 进行分句
type LRUCache ¶ added in v1.6.5
type LRUCache struct {
// contains filtered or unexported fields
}
type Name2FnMap ¶ added in v1.6.10
type Name2FnMap map[string]CommonValidFn
Name2FnMap 自定义验证名对应自定义验证函数
type VMap ¶ added in v1.6.10
type VMap struct {
// contains filtered or unexported fields
}
VMap 验证 map
func (*VMap) SetValidFn ¶ added in v1.6.10
func (v *VMap) SetValidFn(validName string, fn CommonValidFn) *VMap
SetValidFn 自定义设置验证函数
type VStruct ¶ added in v1.5.17
type VStruct struct {
// contains filtered or unexported fields
}
VStruct 验证结构体
func NewVStruct ¶
NewVStruct 验证结构体, 默认目标 tagName 为 "valid"
func (*VStruct) SetRule ¶ added in v1.5.17
SetRule 指定结构体设置验证规则, 不传则验证最外层的结构体 obj 只支持一个参数, 多个无效, 此参数 待验证结构体
func (*VStruct) SetValidFn ¶ added in v1.5.17
func (v *VStruct) SetValidFn(validName string, fn CommonValidFn) *VStruct
SetValidFn 自定义设置验证函数
type VUrl ¶ added in v1.5.29
type VUrl struct {
// contains filtered or unexported fields
}
VUrl 验证 url
func (*VUrl) SetValidFn ¶ added in v1.5.29
func (v *VUrl) SetValidFn(validName string, fn CommonValidFn) *VUrl
SetValidFn 自定义设置验证函数
type VVar ¶ added in v1.5.27
type VVar struct {
// contains filtered or unexported fields
}
VVar 验证单字段
func (*VVar) SetValidFn ¶ added in v1.5.29
func (v *VVar) SetValidFn(validName string, fn CommonValidFn) *VVar
SetValidFn 自定义设置验证函数