一文了解Validator库

这篇具有很好参考价值的文章主要介绍了一文了解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 标签定义一些验证规则。

其中FirstNameLastName 都设置了 required 规则,Age 设置了gte=0lte=130 规则,Email 则设置了requiredemail 两个规则。其中requiredgtelteemail 规则是 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库,我们可以专注于验证逻辑的编写,而不必担心数据结构的解析和重复的验证代码,能够很好得提高代码的可读性和可维护性。文章来源地址https://www.toymoban.com/news/detail-688233.html

到了这里,关于一文了解Validator库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文了解Go语言的I/O接口设计

    I/O 操作在编程中扮演着至关重要的角色。它涉及程序与外部世界之间的数据交换,允许程序从外部,如键盘、文件、网络等地方读取数据,也能够将外界输入的数据重新写入到目标位置中。使得程序能够与外部环境进行数据交换、与用户进行交互、实现数据持久化和文件操作

    2024年02月11日
    浏览(42)
  • Go语言github.com/gorilla/websocket框架websocket协议通信实战

          websocket是实际开发中比较常用的应用层协议,本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 go get github.com/gorilla/websocket 服务器:  Go语言客户端:  We

    2024年02月16日
    浏览(49)
  • go cannot find package “github.com/gorilla/websocket“解读

    在Go开发过程中,我们经常会依赖第三方库来简化开发工作。而使用 go get 命令安装这些库时,有时候我们可能会遇到类似于以下错误的情况: 这个错误意味着Go编译器无法找到名为\\\"github.com/gorilla/websocket\\\"的包。那么我们应该如何解决这个问题呢?下面提供了几种常见的解决方

    2024年01月24日
    浏览(91)
  • Go:如何在GoLand中引用github.com中的第三方包

      本篇博客主要介绍如何在GoLand中引入github.com中的第三方包。具体步骤如下: 正文 (1) 先在GoLand中打开go的工作区目录(即环境变量$GOPATH设置的变量)。如图: 关于工作区目录中的三个子目录: bin: 保存已编译的二进制可执行程序; pkg: 保存已编译的二进制包文件; src: 保存

    2024年01月17日
    浏览(48)
  • 解决go install github.com/mattn/goreman@latest安装报错

    报错: 解决方法如下: 执行成功如下

    2024年02月12日
    浏览(49)
  • 解决GO安装gin框架(go get -u github.com/gin-gonic/gin)超时问题

    🍊gin框架github地址:https://github.com/gin-gonic/gin         按照官方文档安装gin,但是尝试了好几次,包括使用国内网络或者使用梯子,都超时失败了,爆了如下超时错误 🍊 解决方法如下 1、先查看go相关的配置 如上显示GOPROXY配置是https://proxy.golang.org,这个地址已经被墙了,

    2024年02月11日
    浏览(59)
  • golang redis第三方库github.com/go-redis/redis/v8实践

    这里示例使用 go-redis v8 ,不过 go-redis latest 是 v9 安装v8:go get github.com/go-redis/redis/v8 Redis 5 种基本数据类型:  string 字符串类型;list列表类型;hash哈希表类型;set集合类型;zset有序集合类型   最基本的Set/Get操作 # setget.go package  main import  ( \\\"context\\\" \\\"fmt\\\" \\\"time\\\" \\\"github.com/go-re

    2024年02月12日
    浏览(71)
  • \vendor\github.com\godror\orahlp.go:531:19: undefined: VersionInfo

    …goAdminvendorgithub.comgodrororahlp.go:531:19: undefined: VersionInfo 解决办法 降了go版本(go1.18),之前是go1.19 gorm版本不能用最新的,降至(gorm.io/gorm v1.21.16)就可以 修改交插编译参数 go env -w CGO_ENABLED=1 cgo: C compiler “gcc” not found: exec: “gcc”: executable file not found in %PATH% 解决方法:

    2024年02月13日
    浏览(35)
  • Babylonjs Playground中动态加载自己的glb gltf模型(github、dropbox)

    目录 以下提供两种常用的方法 (使用科学梯子) 先说总结:对比 github和dropbox github外链使用方法 方法一:rootUrl添加链接路径。sceneFilename必须置空 方法二:rootUrl填写文件夹路径,sceneFileName填写对应的文件名字 方法三:gltf+bin文件 见案例: 额外补充:群友盲猜大佬整理的

    2024年02月04日
    浏览(37)
  • 一文了解IntelliJ IDEA如何使用git上传代码到GitHub(附常见问题解决方案)

    本文对应知识库文档(持续更新常见问题解决方案中ing) IntelliJ IDEA使用以及下载 (yuque.com) IDEA使用 git 参考链接 https://www.cnblogs.com/chenchenzi/p/14923708.html 解决访问Github出现的Couldn‘t connect to server错误 解决访问Github出现的Couldn‘t connect to server错误-CSDN博客 解决IDEA中用Git推送时

    2024年02月04日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包