golang轻量级数据模型验证插件库Validator的使用

Golang轻量级数据模型验证插件库Validator的使用

Validator是一个用Go编写的轻量级模型验证器。

特性

  • 支持多语言

快速开始

package main

import (
	"fmt"
	v "github.com/go-the-way/validator"
)

func main() {
	// 创建一个结构体并添加验证标签
	result := v.New(&struct {
		int `validate:"min(10,fail)"`  // 验证int值是否>=10,不通过时返回"fail"消息
	}{}).Validate()
	
	// 输出验证结果
	fmt.Println(result.Passed)      // 打印验证是否通过
	fmt.Println(result.Messages())  // 打印验证消息
}

自定义验证实现

package main

import (
	"fmt"
	v "github.com/go-the-way/validator"
	"reflect"
)

func main() {
	// 注册自定义验证器
	v.Custom("mycustom", func(value reflect.Value) (bool, string) { 
		return false, "mycustom validation." 
	})
	
	// 使用自定义验证器
	vv := v.New(&struct {
		Name string `validate:"custom(mycustom)"`  // 使用自定义验证器
	}{}).Validate()
	
	// 输出验证结果
	fmt.Println(vv.Passed)      // 打印验证是否通过
	fmt.Println(vv.Messages())  // 打印验证消息
}

支持的验证器

名称 支持类型 示例 描述
Min ([])(*)uint{8,64}, ([])(*)int{8,64}, ([])(*)float{32,64} validate:“min(N,invalid)” 每个值必须 >= N
Max ([])(*)uint{8,64}, ([])(*)int{8,64}, ([])(*)float{32,64} validate:“max(N,invalid)” 每个值必须 <= N
Length (*)string, (*)Array[(*)string], (*)Slice[(*)string] validate:“length(N,invalid)” 字符串长度或每个字符串元素的长度必须 == N
ArrLength (*)Array[(*)Any], (*)Slice[(*)Any] validate:“arr_length(N,invalid)” 数组或切片的长度必须 == N
MinLength (*)string, (*)Array[(*)string], (*)Slice[(*)string] validate:“minlength(N,invalid)” 字符串长度或每个字符串元素的长度必须 >= N
ArrMinLength (*)Array[(*)Any], (*)Slice[(*)Any] validate:“arr_minlength(N,invalid)” 数组或切片的长度必须 >= N
MaxLength (*)string, (*)Array[(*)string], (*)Slice[(*)string] validate:“maxlength(N,invalid)” 字符串长度或每个字符串元素的长度必须 <= N
ArrMaxLength (*)Array[(*)Any], (*)Slice[(*)Any] validate:“arr_maxlength(N,invalid)” 数组或切片的长度必须 <= N
Enum ([])(*)uint{8,64}, ([])(*)int{8,64}, ([])(*)float{32,64}, ([])(*)string validate:“enum(O,invalid)” 每个值必须是O中的一个
Regex ([])(*)string validate:“regex(RE,invalid)” 每个值必须匹配RE正则表达式
Valid *struct{} validate:“valid(T,invalid)” 值必须不为nil
Custom any validate:“custom(CUSTOM)” 自定义验证

更多关于golang轻量级数据模型验证插件库Validator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级数据模型验证插件库Validator的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级数据模型验证插件库Validator的使用

Validator是Go语言中一个非常流行的轻量级数据验证库,它提供了简单而强大的方式来验证各种数据结构。下面我将详细介绍它的使用方法。

安装Validator

首先需要安装validator库:

go get github.com/go-playground/validator/v10

基本使用

1. 简单验证

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Name     string `validate:"required,min=3,max=20"`
	Email    string `validate:"required,email"`
	Age      int    `validate:"gte=18,lte=60"`
	Password string `validate:"required,min=8"`
}

func main() {
	validate := validator.New()

	user := User{
		Name:     "John",
		Email:    "john@example.com",
		Age:      25,
		Password: "secret123",
	}

	err := validate.Struct(user)
	if err != nil {
		fmt.Println("Validation errors:", err)
	} else {
		fmt.Println("Validation passed!")
	}
}

2. 常用验证标签

Validator提供了丰富的验证标签:

  • required - 字段必须设置
  • min/max - 最小/最大值(数字)或长度(字符串)
  • len - 固定长度
  • eq/ne - 等于/不等于
  • gt/gte/lt/lte - 大于/大于等于/小于/小于等于
  • email - 必须是有效的电子邮件地址
  • url - 必须是有效的URL
  • alpha - 只能包含字母
  • alphanum - 只能包含字母和数字
  • numeric - 必须是有效的数字
  • hexadecimal - 必须是有效的十六进制
  • uuid - 必须是有效的UUID

高级用法

1. 自定义验证函数

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

var validate *validator.Validate

func init() {
	validate = validator.New()
	_ = validate.RegisterValidation("coolusername", validateCoolUsername)
}

func validateCoolUsername(fl validator.FieldLevel) bool {
	username := fl.Field().String()
	return len(username) > 5 && username[0] == 'x'
}

type User struct {
	Username string `validate:"required,coolusername"`
}

func main() {
	user := User{Username: "xander"}

	err := validate.Struct(user)
	if err != nil {
		fmt.Println("Validation error:", err)
	} else {
		fmt.Println("Validation passed!")
	}
}

2. 嵌套结构体验证

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type Address struct {
	Street string `validate:"required"`
	City   string `validate:"required"`
	Zip    string `validate:"required,numeric,len=5"`
}

type User struct {
	Name    string  `validate:"required"`
	Age     int     `validate:"gte=18"`
	Address Address `validate:"required"`
}

func main() {
	validate := validator.New()

	user := User{
		Name: "Alice",
		Age:  20,
		Address: Address{
			Street: "123 Main St",
			City:   "New York",
			Zip:    "10001",
		},
	}

	err := validate.Struct(user)
	if err != nil {
		fmt.Println("Validation errors:", err)
	} else {
		fmt.Println("Validation passed!")
	}
}

3. 错误处理

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Name  string `validate:"required"`
	Email string `validate:"required,email"`
	Age   int    `validate:"gte=18"`
}

func main() {
	validate := validator.New()

	user := User{
		Name:  "",
		Email: "invalid-email",
		Age:   16,
	}

	err := validate.Struct(user)
	if err != nil {
		if _, ok := err.(*validator.InvalidValidationError); ok {
			fmt.Println("Invalid validation error:", err)
			return
		}

		for _, err := range err.(validator.ValidationErrors) {
			fmt.Printf("Field: %s, Error: %s, Value: %v\n", 
				err.Field(), 
				err.Tag(), 
				err.Value())
		}
	}
}

4. 跨字段验证

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type Registration struct {
	Email           string `validate:"required,email"`
	Password        string `validate:"required,min=8"`
	PasswordConfirm string `validate:"required,eqfield=Password"`
}

func main() {
	validate := validator.New()

	reg := Registration{
		Email:           "test@example.com",
		Password:        "password123",
		PasswordConfirm: "password123",
	}

	err := validate.Struct(reg)
	if err != nil {
		fmt.Println("Validation errors:", err)
	} else {
		fmt.Println("Validation passed!")
	}
}

性能优化

Validator默认会缓存结构体的验证信息,因此重复验证相同结构体时性能很好。对于高性能场景,可以预先解析验证规则:

type User struct {
	Name string `validate:"required"`
	Age  int    `validate:"gte=18"`
}

func main() {
	validate := validator.New()
	userType := reflect.TypeOf(User{})

	// 预先解析验证规则
	if _, err := validate.GetStructValidationRules(userType); err != nil {
		panic(err)
	}

	// 后续验证会更快
	user := User{Name: "John", Age: 20}
	_ = validate.Struct(user)
}

总结

Validator是一个功能强大且灵活的Go语言验证库,具有以下特点:

  1. 轻量级且高性能
  2. 丰富的内置验证规则
  3. 支持自定义验证函数
  4. 良好的错误处理机制
  5. 支持嵌套结构体验证
  6. 支持跨字段验证

通过合理使用Validator,可以大大简化Go应用程序中的数据验证工作,同时保持代码的整洁和可维护性。

回到顶部