golang 组件 validator介绍以及使用案例——单字段验证和结构体验证

2023-10-14 12:44

本文主要是介绍golang 组件 validator介绍以及使用案例——单字段验证和结构体验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

golang validator验证器

validator源码

validator是一个字段验证框架,可以用于各种字段的验证。包括结构体验证

validator框架

多个验证标签之间符号说明
  • 逗号(,):多个验证标签分隔符。例如:validate:"required,email
  • 横线(-):跳过该字段不验证
  • 竖线(|):使用多个验证标记,但只需满足其中一个即可
  • omitempty:如果字段未设置,则忽略该符号后面的校验
  • dive:表示深入一层验证,用于切片与集合(slice、map)
预定义Tag
常见网络相关tag
1. fqdn:完全限定域名,例如:www.baddu.com
2. hostname:主机名称
3. hostname_port:主机端口
4. ip:ip地址,包括ipv4和ipv6
5. ipv4
6. ipv6
7. mac:mac地址
8. uri:统一资源标识符
9. url:统一资源定位符
10. url_encode
常见字符串tag
1. alpha:字母字符串
2. alphanum :字母与数字字符串
3. alphaunicode:字母和Unicode字符
4. alphanumunicode:字母、数字和Unicode字符
5. ascii:ascii字符串
6. boolean:布尔类型字符
7. contains:字符串包含指定内容,例如:contains=www,表示被校验字符串应包含“www”
8. endsnotwith:字符串不以指定内容结尾,例如:endsnotwith=www
9. startsnotwith:字符串不以指定内容开头
10. endswith:字符串以指定内容结尾,例如:endswith=com
11. startswith:字符串以指定内容开头
12. excludes:字符串不包含指定内容,与contains相反
13. lowercase:字符串全小写
14. uppercase:字符串全大写
15. multibyte:多字节字符串
16. number:数字类型,数字如:"12345678"
17. numeric:数值类型,数字如:"123.345"
常见格式相关tag
1. base64:base64字符串
2. base64url:base64URL字符串
3. credit_card:信用卡号
4. datetime:根据给定时间格式验证,例如:datetime=2006-01-02 15:04:05
5. e164:手机号码验证,手机号码格式如:+8613800138000
6. email:电子邮箱地址
7. hexadecimal:16进制字符串
8. json:json字符串
9. jwt:jwt字符串
10. latitude:纬度
11. longitude:经度
12. timezone:时区,时区如:Asia/Shanghai
13. iscolor:是否为颜色
14. country_code:国家代码
比较相关tag
1. eq:等于,eg=10
2. gt:大于,gt=10
3. gte:大于等于,gte=10
4. lt:小于,lt=10
5. lte:小于等于,lte=10
6. ne:不等于,ne=10
其他tag
1. dir:目录
2. file:文件路径
3. isdefault:验证值是否为默认值(零值),相当于 eq=零值
4. len:长度,可用于字符串、切片、集合
5. max:最大值、长度,可用于数字、字符串、切片、集合
6. min:最小值、长度,可用于数字、字符串、切片、集合
7. oneof:指定内容中的某一个值,例如:oneof=red green,那么只有取值为 red或green才能验证
通过
8. required:必填
9. required_if:满足条件必填,例如:required_if=Field1 test,当Field1=test,则必填
10. required_unless:除指定条件外,其他情况必填,例如:required_unless=Field1 test,当
Field1!=test,则必填
11. required_with:如果指定的字段有值,则必填,例如:required_with=Field1,当Field1不为零
值,则必填
12. required_with_all:如果指定的字段都有值,则必填,例如:required_with_all=Field1 Field2,
当Field1 Field2 两个字段都不为零值,则必填
13. required_without:如果指定的字段没有值,则必填,例如:required_without=Field1,当Field1
为零值,则必填
14. required_without_all:如果指定的字段都没有值,则必填,例如:required_without_all=Field1
Field2,当Field1 Field2 两个字段都为零值,则必填
15. excluded_with、excluded_with_all、excluded_without、excluded_without_all 与required相
反,表示满足某些条件,必须不填(即必须为零值)
字段相关tag
1. eqcsfield:字段与其他字段相等
2. eqfield:字段与其他字段相等
3. fieldcontains:字段包含其他字段值
4. fieldexcludes:字段不包含其他字段值
5. gtcsfield:字段大于其他字段值
6. gtecsfield:字段大于等于其他字段值
7. gtefield:字段大于等于其他字段值
8. gtfield:字段大于其他字段值
9. ltcsfield:字段小于其他字段值
10. ltecsfield:字段小于等于其他字段值
11. ltefield:字段小于等于其他字段值
12. ltfield:字段小于其他字段值
13. necsfield:字段不等于其他字段
14. nefield:字段不等于其他字段
注:字段相关tag,包括两种情况,
1. tag包含cs:表示与对象内部其他对象字段的字段比较。
2. tag不包含cs:表示与对象内部其他基础类型字段比较

单字field段验证

bool
var b = "true"
err = v.Var(b, "boolean")
数字
var i = "100"err = v.Var(i, "number,gt=1,lt=101")
outRes("number", &err)var f = "100.132"err = v.Var(f, "numeric")
outRes("numeric", &err)
字符串
var str = "abcdef"
err = v.Var(str, "alpha")
outRes("alpha", &err)
切片
var slice = []int{1,2,3,4,5,6,7,8}
err = v.Var(slice, "max=15,min=4")
outRes("slice", &err)
集合
var mp = make(map[int]int)
mp[2] = 3
mp[1] = 1
mp[3] = 3
err = v.Var(mp, "max=15,min=4")
时间
var timeStr = time.Now().Format("2006-01-02  15:04:05")
fmt.Println("timestra:" )
fmt.Println("timestr:" + timeStr)
err = v.Var(timeStr, "datetime=2006-01-02 15:04:05")
outRes("time", &err)
比较
s1 := "abc"
s2 := "cda"err = v.VarWithValue(s1, s2, "eqfield")
outRes("eqfield", &err)
案例代码
package validateimport ("fmt""time"
)// bool
// 数字
// 字符串
// 切片
// 集合
// 时间func SingleFieldValidate() {v := validatevar err errorvar b = "true"err = v.Var(b, "boolean")printValidateResult("boolean", &err)var i = "100"err = v.Var(i, "number,gt=1,lt=101")printValidateResult("number", &err)var f = "100.132"err = v.Var(f, "numeric")printValidateResult("numeric", &err)var str = "abcdef"err = v.Var(str, "alpha")printValidateResult("alpha", &err)var slice = []int{1,2,3,4,5,6,7,8}err = v.Var(slice, "max=15,min=4")printValidateResult("slice", &err)var mp = make(map[int]int)mp[2] = 3mp[1] = 1mp[3] = 3err = v.Var(mp, "max=15,min=4")var timeStr = time.Now().Format("2006-01-02  15:04:05")fmt.Println("timestra:" )fmt.Println("timestr:" + timeStr)err = v.Var(timeStr, "datetime=2006-01-02 15:04:05")printValidateResult("time", &err)s1 := "abc"s2 := "cda"err = v.VarWithValue(s1, s2, "eqfield")printValidateResult("eqfield", &err)}

结构struct绑定验证

结构体字段深入验证

使用dive标签,然后在子结构体定义的字段中进行标签填写。

切片字段深入验证
type User struct {Hobby       []string             `v:"required,gte=2,dive,required,gte=1,alphaunicode"`  // 深入下一层验证,后续接长度大于等于2,并且是字母+unicode
}

切片验证 dive 后是切片元素的验证

Map字段深入验证
type User struct {// 深入下一层验证,keys,alpha,gte=2,lte=10,endkeys 这一段是验证map的key, endkeys后面是跟对应value的校验Data        map[string]string    `v:"required,gte=2,dive,keys,alpha,gte=2,lte=10,endkeys,required,gte=2,alphaunicode"`
}

````v:"required,gte=2,dive,keys,alpha,gte=2,lte=10,endkeys,required,gte=2,alphaunicode"表面,data字段必填,长度大于等于2。dive深入一层验证。keys … endkeys```中间是keys的字段验证。 endkeys后是values的字段验证。

案例:

package validateimport ("fmt""github.com/go-playground/validator/v10"
)/*字段都必填contactUser字段 phone email address 三选一
*/
type User struct {Name        string               `v:"required,alphaunicode"`       // v是因为 validate.SetTagName("v")Age         uint8	             `v:"required,gte=10,lte=130"`Phone       string               `v:"required,e164"`               // e164电话的一种格式Email       string               `v:"required,email"`FavouriteColor1 string            `v:"iscolor"`FavouriteColor2 string            `v:"hexcolor|rgb|rgba|hsl|hsla"`  // 颜色格式 16进制Address     *Address             `v:"required"`ContactUser []*ContactUser        `v:"required,gte=1,dive"`          // dive 深入到下一层验证Hobby       []string             `v:"required,gte=2,dive,required,gte=1,alphaunicode"`  // 深入下一层验证,后续接长度大于等于2,并且是字母+unicode// 深入下一层验证,keys,alpha,gte=2,lte=10,endkeys 这一段是验证map的key, endkeys后面是跟对应value的校验Data        map[string]string    `v:"required,gte=2,dive,keys,alpha,gte=2,lte=10,endkeys,required,gte=2,alphaunicode"`
}type ContactUser struct {Name    string   `v:"required,alphaunicode"`Age     uint8    `v:"gte=10,lte=130"`Phone   string   `v:"required_without_all=Email Address,omitempty,e164"`   //required_without_all 如果指定字段没有值,则必填  可以为空Email   string   `v:"required_without_all=Phone Address,omitempty,email"`  // 可以为空Address *Address `v:"required_without_all=Phone Email"`
}type Address struct {Province string   `v:"required"`City     string   `v:"required"`}func StructValidate() {addr := &Address{Province: "湖南",City:     "长沙",}contactUser1 := &ContactUser{Name:  "yy",Age:   18,Phone: "+8613800138111",}contactUser2 := &ContactUser{Name:  "张三",Age:   18,Email: "zhangsan@0kuangtu.com",}user := &User{Name:            "yuan",Age:             18,Phone:           "+8613800138111",Email:           "yuan@0google.com",FavouriteColor1: "#ffff",FavouriteColor2: "rgb(255,255,255)",Address:         addr,ContactUser:     []*ContactUser{contactUser1, contactUser2},Hobby:           []string{"篮球", "唱", "rap"},Data:            map[string]string{"AB": "篮球", "CD": "rap"},}err := validate.Struct(user)if err != nil {// validator.ValidationError是每个字段错误组合的切片if errors, ok := err.(validator.ValidationErrors); ok {for _, err := range errors {fmt.Println(err)}}}
}

这篇关于golang 组件 validator介绍以及使用案例——单字段验证和结构体验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210604

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置