golang validator 包的使用指北

看到 validator 咱们第一反应会想起啥?见名知意我就可以知道他是一个验证器,如果用过 gin web 框架的同学,自然是用过 gin 里面的 validator,只不过 gin 中使用的关键字是 binding 去做标识

开门见山

Validator 实际上是一个验证工具,属于 golang 的第三方包,这个包中使用了各种反射技巧来提供了各种校验和约束数据的方式方法,非常实用,常用的有这些:

  • 基本的字段长度,大小,范围的约束

    • len:约束参数长度
    • eq:数值等于参数值
    • max:数值小于等于参数值
    • min:数值大于等于参数值
    • ne:不等于参数值
    • gt:大于参数值,gte:大于等于参数值
    • lt:小于参数值, lte:小于等于参数值
    • oneof:只能是枚举值中的一个,这些值必须是数值或字符串,以空格分隔,如果字符串中有空格,则使用单引号包围。例如:oneof=changsha beijing haerbing
  • 是否必选,是否跳过,是否忽略

    • -:跳过该字段
    • | :使用多个约束,只需要满足其中一个,例如:xxx| xxx
    • required:必选约束,不能为默认值
    • omitempty:如果字段未设置,则忽略它
  • 各种格式约束如

    • email
    • url
    • ip、ipv4、ipv6
    • uuid
    • datetime
    • json
    • file , 参数必须是一个合法的文件路径

常用的大概有上述这些,我们也不需要去背,只需要知道如何去使用,以及咱们需要处理数据校验的时候,能够想到 validator 库就行了,实在记不起来看官方文档或者看本篇文章的例子就可以了,这个是官网:

validator package - github.com/go-playground/validator/v10 - Go Packages

使用

使用 validator 工具, 自然是为了提高我们的开发效率以及让我们写出来的内容更加优雅和健壮

如果我们自己每一个字段都显示的去校验是否符合我们预期,那么代码大概率会很臃肿,来一个简单的 demo,举个栗子

package mainimport ("fmt""github.com/go-playground/validator/v10"
)type Data struct {City       string `validate:"min=8,max=15"`Name       string `validate:"min=6,max=10"`Addr       string `validate:"url"`Age        int    `validate:"gte=18,lte=100"`Tall       int    `validate:"required"`IpAddr     string `validate:"ipv4"`Email      string `validate:"email"`Content    string `validate:"json"`CreateTime string `validate:"datetime=2006-01-02"`NewPwd     string `validate:"min=8"`RePwd      string `validate:"eqfield=NewPwd"`
}func main() {// 示例 , 基本使用介绍validate := validator.New()demo1 := Data{City:       "changsha11111111111111",Name:       "xiaozhu",Addr:       "xxxxxxxxx",Age:        25,Tall:       185,IpAddr:     "xxxxxxxxxxx",Email:      "helloworld@qq.com",Content:    "{"name":"xiaozhu"}",CreateTime: "xxxxx2006-03-02",NewPwd:     "12345",RePwd:      "123456789xxxxx",}err := validate.Struct(demo1)if err == nil {fmt.Println("params check success")return}invalid, ok := err.(*validator.InvalidValidationError)if ok {fmt.Println("param invalid : ", invalid)return}valiErrs := err.(validator.ValidationErrors)for _, valiErr := range valiErrs {fmt.Println(valiErr)}
}

此处我们可以看到我们在 Data 数据结构中,对其成员进行了不同的约束,相信通过 xdm 看到 Data 结构中的 validate 标识后面的约束,就知道响应字段的约束是啥意思了

例如

Age int `validate:"gte=18,lte=100"`

约束 Age 这个字段,需要满足 大于等于 18 ,小于等于 100 的范围

RePwd string `validate:"eqfield=NewPwd"`

RePwd 字段,需要和 NewPwd 字段相等 ,这个是用 eqfield 做标识的

关于 xxfield 的跨字段约束的相关标识可以查看官网的此处

这里是 valiator 能支持的所有类型,从字段内容,网络方面,字符串,数据结构,比较的字符,其他的标识

另外关于邮箱约束的:

Email string `validate:"email"`

Email 字段,必须是 email 格式的,才能够检验通过

如上,每一个字段,如果需要校验的,校验失败,我们也可以全部打印出来

目前在 validator 中,处理错误信息,分为 2 种错误的情况:

  • InvalidValidationError

咱们将我们的 err 转换成 InvalidValidationError ,表示输入参数错误

  • ValidationErrors:字段违反约束,错误信息如下

咱们将我们的 err 转换成 ValidationErrors,这是一个切片,所以咱们可以遍历输出,这个是表示不符合约束字符的有错误原因

validator.ValidationErrors 是一个 FieldError 类型的切片

type ValidationErrors []FieldError

FieldError 中包含了关于 error 的全部信息,我们可以调用 FieldError 里面的成员方法进行输出即可

type FieldError interface {Tag() stringActualTag() stringNamespace() stringStructNamespace() stringField() stringStructField() stringValue() interface{}Param() stringKind() reflect.KindType() reflect.TypeTranslate(ut ut.Translator) stringError() string
}

关于其他标识的使用就不过多赘述了,使用方式都大同小异,咱们可以参考上述的 demo 即可

自定义约束

当然,如果认为官方提供的支持的标识还不能满足我们的要求,那么我们也是可以自定义咱们的标识的,例如,咱们要定义的标识是 happyhead含义就是,咱们定义的字符串,必须是以 happy 开头的,否则就校验不通过

此时咱们就需要使用到 validator 包中的 RegisterValidation 方法,再按照这个方法,提供一个校验实际参数的回调函数即可:

我们就可以这样来写

查看实际效果如下:

demo1 validate failed :  Key: 'RegisterFormat.Name' Error:Field validation for 'Name' failed on the 'happyhead' tag
demo2 validate success ...

至此,咱们将 validator 包中的特殊约束,格式约束,错误处理,范围约束,字符串约束,以及自定义约束都简单过了一下,这些东西不需要朗读和背诵,只需要咱们知道有他,需要的时候,能够找到,能够迅速使用起来即可

当然,如果想研究他的实现原理的,可以好好看看 validator 源码包以及官方文档,还是非常有意思的

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs文件上传漏洞通关

一、环境搭建 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。 下载地址:https://github.com/c0ny1/upload-labs/releases 在 win 环境下 直接解压到phpstudy下即可 二、通关 (一)16关…

ansible的安装和简单的块使用

目录 一、概述 二、安装 1、选择源 2、安装ansible 3、模块查看 三、实验 1、拓扑​编辑 2、设置组、ping模块 3、hostname模块 4、file模块 ​编辑 5、stat模块 6、copy模块(本地拷贝到远程) 7、fetch模块与copy模块类似,但作用…

Spring AOP使用指南: 强大的面向切面编程技术

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Spring Boot 整合 Redis,使用 RedisTemplate 客户端

文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…

基于jeecg-boot的flowable流程历史记录显示修改

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 历…

文件上传漏洞

条件竞争 条件竞争型的漏洞在很多漏洞中都有涉及,在文件上传中造成这种漏洞的原因是代码中是先保存上传的文件在服务器上,然后验证再删除的,这就会造成攻击者可以利用文件被保存在服务器上与被删除的时间间隙来访问文件,然后重新生…

基于Java+SpringBoot+Vue校园求职招聘系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

OpenCV实现图像的混合

原理 这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。 图像混合的计算公式如下: g(x)(1-a)f0(x) af1(x) 通过修改α的值(0→1) ,可以实现非常炫酷的混合。 现在我们把两幅图混合在一起。 第一幅图…

分布式多级缓存

例子(测试环境) 项目结构图 运行反向代理服务器也就是负责反向代理到三个nginx的nginx,该nignx也负责前端页面的跳转。 该nginx的conf为下: 突出位置就是该nginx需要反向代理的其他nginx的IP和端口。 Lua语法 linux安装Lua #安装lua环境 …

持安科技入选数说安全《2023中国网络安全市场年度报告》

近日,网络安全产业研究平台数说安全发布《2023中国网络安全市场年度报告》,报告共分为158页核心报告,及番外篇《网安融资新星及融资过亿企业介绍》,作为以甲方身份创业的零信任办公安全明星企业,持安科技以网安融资新星…

SQL数据库查询超时,查询数据库的哪些表被上锁的语句

1.异常提示 2.表语句 2.1 查询锁表的语句 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECT * 若是下面没有显示内容,说明当前没有锁住的表 2.2若是有显示锁住的表&#…

STM32移植FAT文件系统

所谓“移植”,就是打通FAT源码和物理设备之间的软件接口。 FAT源码早就被公益组织给写好了,直接下载源码。但是FAT作为顶层应用程序,它需要面对的底层物理设备是不确定的,那么底层的物理设备驱动程序就需要程序员来自己写。物理设…

18 矩阵置0

矩阵置0 题解1 首行首列做标志记录(原地改数组)题解2 位计算 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示: m matrix.lengthn matrix[0].length1 …

无涯教程-JavaScript - CUMPRINC函数

描述 CUMPRINC函数返回start_period和end_period之间的贷款累计本金。 语法 CUMPRINC (rate, nper, pv, start_period, end_period, type)争论 Argument描述Required/OptionalRateThe interest rate.RequiredNperThe total number of payment periods.RequiredPvThe presen…

Wireshark 用命令行分析数据包

1,那些情况需要使用命令行 Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息,最后只显示相关数据,比如用单独一行来显示IP地址。命令行工具适用于过滤数据包捕获文件,并提供结果给另一个支持UNIX管道的工具…

手动开发-简单的Spring基于注解配置的程序--源码解析

文章目录 设计注解$设计容器 $#完整代码# 在前文中 《手动开发-简单的Spring基于XML配置的程序–源码解析》,我们是从XML配置文件中去读取bean对象信息,再在自己设计的容器中进行初始化,属性注入,最后通过getBean()方法进行返回。…

Kafka/Spark-01消费topic到写出到topic

1 Kafka的工具类 1.1 从kafka消费数据的方法 消费者代码 def getKafkaDStream(ssc : StreamingContext , topic: String , groupId:String ) {consumerConfigs.put(ConsumerConfig.GROUP_ID_CONFIG , groupId)val kafkaDStream: InputDStream[ConsumerRecord[String, Strin…

WebRTC中 setup:actpass、active、passive

1、先看一下整个DTLS的流程 setup:actpass、active、passive就发生在Offer sdp和Anser SDP中 Offer的SDP是setup:actpass,这个是服务方: v0\r o- 1478416022679383738 2 IN IP4 127.0.0.1\r s-\r t0 0\r agroup:BUNDLE 0 1\r aextmap-allow-mixed\r amsid-semanti…

在MySQL客户端使用Tab健进行命令补全

在MySQL客户端中,你可以使用Tab键进行命令补全,这将提高我们的效率,这与Linux命令行中的行为类似。例如,如果你输入SEL然后按Tab键,MySQL客户端会自动补全为SELECT。 然而,需要注意的是,这个功能…

Unity Asset Bundle Browser 工具

Unity Asset Bundle Browser 工具 您可以在 Unity 项目中使用 Asset Bundle Browser 工具能够查看和编辑资源包的配置。 有关更多信息,请参阅 Unity Asset Bundle Browser 文档。 注意:此工具是不受支持的实用程序。查看极大的资源包可能会导致性能下…