开发过程中,我们往往需要对用户提交的数据进行验证,以保证数据的合法性和完整性。今天我们就来介绍 Go 语言社区推出的一个验证包 —— validator。
validator 包根据 tags 对结构体和单个字段的值进行验证。它具备以下优秀的功能:
- 提供了一系列验证规则用于验证,并且支持自定义验证规则;
- 支持跨字段、跨结构体进行验证;
- 支持多维字段如 array、slice、map 等;
- 在验证接口类型前会先确定它的底层数据类型;
- 支持自定义字段类型比如 sql 驱动程序 Valuer;
- 可以自定义并支持国际化(i18n)的错误信息;
- 是 gin 框架的默认验证器。
1.安装
使用 go get
:
go get github.com/go-playground/validator/v10
然后在你的源码中引入 validator 包:
import "github.com/go-playground/validator/v10"
2.使用
2.1 基本使用
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
FirstName string `validate:"required"`
LastName string `validate:"required"`
Age uint8 `validate:"gte=0,lte=130"`
}
var validate *validator.Validate
func main() {
validate = validator.New()
validateStruct()
}
func validateStruct() {
user := &User{
FirstName: "Badger",
LastName: "Smith",
Age: 135,
}
err := validate.Struct(user)
if err != nil {
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err.Namespace()) // User.Age
fmt.Println(err.Field()) // Age
fmt.Println(err.StructNamespace()) // User.Age
fmt.Println(err.StructField()) // Age
fmt.Println(err.Tag()) // lte
fmt.Println(err.ActualTag()) // lte
fmt.Println(err.Kind()) // uint8
fmt.Println(err.Type()) // uint8
fmt.Println(err.Value()) // 135
fmt.Println(err.Param()) // 130
fmt.Println(err.Error()) // Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
fmt.Println()
}
}
}
2.2 跨字段验证
跨字段的验证规则有很多&#x