一文了解Validator库
1. 引言
github.com/go-playground/validator
是一个 Go 语言的库,用于对结构体字段进行验证。它提供了一种简单而灵活的方式来定义验证规则,并在验证过程中检查结构体字段是否满足这些规则。这个库可以用于验证各种数据,包括从用户输入到 API 请求中的数据,以确保数据的完整性和有效性。
在这篇文章中,我们将从一个简单的问题出发,带你了解 Validator
库的用途,也会介绍Validator
的基本使用,同时也会介绍Validator
能够给我们带来的优点。
2. 问题引入
在平常开发过程中,不管是Web应用程序来接收页面请求,还是创建一个服务来接收其他服务的请求,不可避免的,我们都需要检查请求参数是否合法,是否有效。
假设我们开发一个用户注册功能的 Web 应用程序。用户在注册页面上提供了以下信息:用户名、电子邮件地址、密码和确认密码。那么我们必须编写下述代码,保证用户输入信息合法性,如下:
type User struct {
Username string
Email string
}
func (u *User) checkUserIsInvalid() error {
// 检查用户名长度是否合法
if len(user.Username) < 3 || len(user.Username) > 20 {
return errors.New("Invalid username length")
}
// 检查电子邮件地址是否合法
if !isValidEmail(user.Email) {
return errors.New("Invalid email address")
}
return nil
}
func registerUser(user User) error {
// 检查输入是否合法
err := user.checkUserIsInvalid()
if err != nil {
return errors.New("Invalid Input")
}
// 用户注册逻辑...
return nil
}
这里的实现并没有太大的问题。但是如果程序中有20个地方,都检查了用户名长度是否合法,如果这个验证逻辑更复杂一点,那就不太合理了,这里的一个做法是将验证逻辑抽取为一个函数,示例如下:
func checkUserNameIsValid(username string) bool{
if len(username) < 3 || len(username) > 20 {
return false
}
return true
}
然后用到这段逻辑的,直接调用该函数即可,不需要再重复实现,这个也能够解决一部分场景的问题。但是假想一下,如果我们的验证逻辑不像上面那么简单,而是涉及到多个字段的组合验证,类型转换,嵌套结构体的场景,这个时候我们的验证逻辑会非常复杂。
比如我们需要实现一个嵌套结构体的校验逻辑,此时我们需要遍历每一个字段,可能会有非常深的if...else代码,亦或者比较深层次的函数调用,这个复杂逻辑不管是实现还是后续的阅读,都会花费我们大量的精力。
回归到我们的诉求,其实我们并不是很关心嵌套了多少层结构体,我们更关注的是针对某一个 字段/值,其值是否满足我们的预期。那有没有办法,做到我们实现一个验证逻辑,通过某种手段作用到目标字段,而不需要去关注具体的数据结构,这样子既能做到验证逻辑的复用,同时也避免了对复杂数据结构的解析,从而简化我们的验证逻辑。
其实还真有,当前存在大量的验证库,能够帮助我们实现数据验证。接下来我们就来了解下Go语言中的Validator
库,其能够让我们专注于验证逻辑的编写,而不需要考虑逻辑的复用以及复杂数据结构的处理等许多问题,同时在某种程度上也提高了代码的可读性。
3. Validator 的基本使用
Validator
是基于标签来实现的,我们只需要在结构体的字段上使用 validate
标签,然后设置标签值,每一个标签值代表一个验证规则。这些标签值将告诉 validator
结构体的字段应该满足哪些条件,然后通过调用Validator
提供的 API
,便能够实现数据的校验。
下面我们通过一个简单的例子来进行说明,帮助我们快速入门Validator
库的使用:
type User struct {
FirstName string `validate:"required"`
LastName string `validate:"required"`
Age uint8 `validate:"gte=20,lte=60"`
Email string `validate:"required,email"`
}
func main() {
validate = validator.New()
user := &User{
FirstName: "Badger",
LastName: "Smith",
Age: 18,
Email: "Badger.Smith@gmail.com",
}
// returns nil or ValidationErrors ( []FieldError )
err := validate.Struct(user)
if err != nil {
fmt.Println(err)
}
}
上面例子中,我们定义了一个 User
结构体,包含了不同类型的字段,每个字段都通过validate
标签定义一些验证规则。
其中FirstName
和 LastName
都设置了 required
规则,Age
设置了gte=0
和 lte=130
规则,Email
则设置了required
和 email
两个规则。其中required
,gte
,lte
和 email
规则是 Validator
库自带的校验规则,可以直接设置。
在结构体设置好验证规则后,在main
函数中通过New
方法创建一个 Validate
实例,然后通过调用Struct
方法,便会自动根据结构体标签设置的规则对对象的值进行验证。如果验证通过,将返回nil
,否则会返回一个ValidationErrors
类型的错误对象,其中包含验证失败的详细信息。
比如上面Age
字段不满足条件,此时user
对象将不能通过校验,会返回对应的错误信息,如下:
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'gte' tag
4. Validator优点
如果我们使用 Validator
库,逻辑就可以抽取出来为一个公共的验证库,然后每一个验证逻辑对应一个验证规则名,这个Validator
库有支持,后续会讲述到。
然后在结构体中,使用validate
标签指定需要的验证规则,这样子我们就不需要待验证数据的数据结构,也复用了验证规则,同时将验证规则与字段绑定到一起,也提高了代码的可读性。
通过使用Validator
库,我们能够回归到核心关注的内容,验证传入数据的合法性, 而不是去解析数据结构,代码复用等一系列复杂的事情,把这些复杂的事情交给 Validator
帮我们做。
5. 总结
本文介绍了 Go 语言中的 github.com/go-playground/validator
库,该库用于对结构体字段进行验证。文章从一个简单的问题出发,引入了Validator
库的使用。
之后介绍了 Validator
库的基本使用,包括如何创建验证实例、执行验证以及处理验证错误。通过示例代码,演示了如何使用标签来设置验证规则,以及如何通过 Validator
库简化数据验证过程,提高代码的可读性和可维护性。
总的来说,在比较复杂的场景,通过使用Validator
库,我们可以专注于验证逻辑的编写,而不必担心数据结构的解析和重复的验证代码,能够很好得提高代码的可读性和可维护性。
一文了解Validator库的更多相关文章
- validator库参数校验
目录 validator库参数校验若干实用技巧 基本示例 翻译校验错误提示信息 自定义错误提示信息的字段名 自定义结构体校验方法 自定义字段校验方法 自定义翻译方法 validator库参数校验若干实 ...
- gin使用validator库参数校验若干实用技巧
validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...
- 常用PDF文档开发库
C++库: 1,PDF类库 PoDoFo http://podofo.sourceforge.net/ PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析 ...
- Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- Excelize 2.3.2 发布,Go 语言 Excel 文档基础库,2021 年首个更新
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- Excelize 发布 2.3.0 版本, Go 语言 Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- Excelize 发布 2.2.0 版本, Go 语言 Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- SpringBoot+rest接口+swagger2生成API文档+validator+mybatis+aop+国际化
代码地址:JillWen_SpringBootDemo mybatis 1. 添加依赖: <dependency> <groupId>org.mybatis.spring.bo ...
- 值得推荐的C/C++框架和库(深度好文)
[本文系外部转贴,原文地址:http://www.cppblog.com/merlinfang/archive/2014/12/26/209311.html http://coolshell.info ...
随机推荐
- 在开发过程中使用git rebase还是git merge,优缺点分别是什么?
前言 在开发过程中,git rebase 和 git merge 都是常见的代码版本管理工具.它们都能够将分支合并到主分支,并且都有各自的优缺点. git merge git merge 是一种将两个 ...
- 代码随想录算法训练营Day50 动态规划
代码随想录算法训练营 代码随想录算法训练营Day50 动态规划| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳时 ...
- 6.4. HttpClient
1. 什么是HttpClient? HttpClient是Java 11中引入的一个新特性,用于支持同步和异步发送HTTP请求以及处理HTTP响应.它提供了简单易用的API,使得发送HTTP请求变得非 ...
- 文盘Rust -- tokio绑定cpu实践
tokio 是 rust 生态中流行的异步运行时框架.在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢?这次我们来聊聊这个话题. 首先我们先写一段简单的多任务 ...
- 第三届陕西省大学生网络安全技能部分WP
web easyrce 题目代码如下: <?php error_reporting(0); highlight_file(__FILE__); if (!empty($_GET['PK'])){ ...
- C++ 学习笔记 (一)
C++标准化组织 https://isocpp.org/std/status http://open-std.org/JTC1/SC22/WG21/ why C++王者归来? https://cool ...
- 了解基于模型的元学习:Learning to Learn优化策略和Meta-Learner LSTM
摘要:本文主要为大家讲解基于模型的元学习中的Learning to Learn优化策略和Meta-Learner LSTM. 本文分享自华为云社区<深度学习应用篇-元学习[16]:基于模型的元学 ...
- docker安装LuaJIT WEB应用防火墙
安装包请见 https://www.jianshu.com/p/b81656764613 Dockerfile #FROM ubuntu FROM centos MAINTAINER G00G1S C ...
- 用R语言实现并行计算:基于R的数据处理和分析工具
目录 引言 随着数据量的爆炸式增长,数据处理和分析的需求也越来越大.传统的批处理计算已经无法满足高效的数据处理和分析需求,因此,并行计算成为了一个重要的技术方向.然而,R语言作为一种开源.可视化能力强 ...
- requests Python中最好用的网络请求工具 基础速记+最佳实践
简介 requests 模块是写python脚本使用频率最高的模块之一.很多人写python第一个使用的模块就是requests,因为它可以做网络爬虫.不仅写爬虫方便,在日常的开发中更是少不了requ ...