详解Go语言中Validator库的使用方法和用途

  目录

  1. 引言

  是一个 Go 语言的库,用于对结构体字段进行验证。它提供了一种简单而灵活的方式来定义验证规则,并在验证过程中检查结构体字段是否满足这些规则。这个库可以用于验证各种数据,包括从用户输入到 API 请求中的数据,以确保数据的完整性和有效性。

  在这篇文章中,我们将从一个简单的问题出发,带你了解 库的用途,也会介绍 的基本使用,同时也会介绍 能够给我们带来的优点。

  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语言中的库,其能够让我们专注于验证逻辑的编写,而不需要考虑逻辑的复用以及复杂数据结构的处理等许多问题,同时在某种程度上也提高了代码的可读性。

  3. 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)

  }

  }

  上面例子中,我们定义了一个 结构体,包含了不同类型的字段,每个字段都通过 标签定义一些验证规则。

  其中 和 都设置了 规则, 设置了 和 规则, 则设置了 和 两个规则。其中,, 和 规则是 库自带的校验规则,可以直接设置。

  在结构体设置好验证规则后,在 函数中通过 方法创建一个 实例,然后通过调用 方法,便会自动根据结构体标签设置的规则对对象的值进行验证。如果验证通过,将返回,否则会返回一个类型的错误对象,其中包含验证失败的详细信息。

  比如上面 字段不满足条件,此时 对象将不能通过校验,会返回对应的错误信息,如下:

  Key: 'User.Age' Error:Field validation for 'Age' failed on the 'gte' tag

  4. Validator优点

  如果我们使用 库,逻辑就可以抽取出来为一个公共的验证库,然后每一个验证逻辑对应一个验证规则名,这个 库有支持,后续会讲述到。

  然后在结构体中,使用 标签指定需要的验证规则,这样子我们就不需要待验证数据的数据结构,也复用了验证规则,同时将验证规则与字段绑定到一起,也提高了代码的可读性。

  通过使用 库,我们能够回归到核心关注的内容,验证传入数据的合法性, 而不是去解析数据结构,代码复用等一系列复杂的事情,把这些复杂的事情交给 帮我们做。

  5. 总结

  本文介绍了 Go 语言中的 库,该库用于对结构体字段进行验证。文章从一个简单的问题出发,引入了 库的使用。

  之后介绍了 库的基本使用,包括如何创建验证实例、执行验证以及处理验证错误。通过示例代码,演示了如何使用标签来设置验证规则,以及如何通过 库简化数据验证过程,提高代码的可读性和可维护性。

  总的来说,在比较复杂的场景,通过使用库,我们可以专注于验证逻辑的编写,而不必担心数据结构的解析和重复的验证代码,能够很好得提高代码的可读性和可维护性。

  以上就是详解Go语言中Validator库的使用方法和用途的详细内容,更多关于Go Validator库使用的资料请关注脚本之家其它相关文章!

  您可能感兴趣的文章: