golang轻量级数据验证库hvalid的使用

Golang轻量级数据验证库hvalid的使用

hvalid是一个用Go语言编写的轻量级验证库,它提供了自定义验证器接口和一系列常用验证函数,帮助开发者快速实现数据验证。

特性

  • 泛型支持:可以验证任何类型的数据,包括基本类型、结构体、切片等
  • 使用简单:提供简洁的API让开发者快速进行参数验证
  • 可扩展:允许自定义验证规则,满足不同的验证需求
  • 友好的错误信息:验证失败时返回清晰的错误信息,方便开发者定位问题

安装

使用go get命令安装:

go get github.com/lyonnee/hvalid

使用示例

基本类型验证

import (
	"errors"
	"github.com/lyonnee/hvalid"
)

func main() {
	// 验证字符串长度
	err := hvalid.Validate[string]("hello", hvalid.MinLen[string](3))
	if err != nil {
		// 处理错误
	}

	// 验证数字范围
	err = hvalid.Validate[int](10, hvalid.Min(5), hvalid.Max(15))
	if err != nil {
		// 处理错误
	}
}

结构体验证

type User struct {
	Name  string
	Email string
	Age   int
}

func UserValidator() hvalid.ValidatorFunc[User] {
	return hvalid.ValidatorFunc[User](func(user User) error {
		if user.Age < 18 {
			return errors.New("Age must be greater than 18")
		}

		return hvalid.Validate[string](user.Email, hvalid.Email())
	})
}

func main() {
	user := User{
		Name:  "Zhang San",
		Email: "zhangsan@example.com",
		Age:   20,
	}

	err := hvalid.Validate[User](user, UserValidator())
	if err != nil {
		// 处理错误
	}
}

自定义验证规则

func IsPositive(errMsg ...string) hvalid.ValidatorFunc[int] {
	return hvalid.ValidatorFunc[int](func(num int) error {
		if num <= 0 {
			if len(errMsg) > 0 {
				return errors.New(errMsg[0])
			}
			return errors.New("The number must be positive")
		}
		return nil
	})
}

func main() {
	err := hvalid.Validate[int](10, IsPositive())
	if err != nil {
		// 处理错误
	}
}

测试

项目包含单元测试,使用go test命令运行所有测试:

go test ./...

贡献

欢迎提交Issue和Pull Request来改进hvalid

许可证

hvalid采用MIT许可证发布。


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

1 回复

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


hvalid - Golang轻量级数据验证库

hvalid 是一个轻量级的 Golang 数据验证库,专注于简单易用和高性能。下面我将介绍如何使用 hvalid 进行数据验证。

安装

go get github.com/hezhizheng/hvalid

基本用法

1. 简单验证

package main

import (
	"fmt"
	"github.com/hezhizheng/hvalid"
)

func main() {
	// 创建验证器
	validator := hvalid.NewValidator()

	// 添加验证规则
	validator.Field("username").
		Required("用户名不能为空").
		MinLength(3, "用户名至少3个字符").
		MaxLength(20, "用户名最多20个字符")

	validator.Field("age").
		Required("年龄不能为空").
		Min(18, "年龄必须大于18岁").
		Max(100, "年龄必须小于100岁")

	// 准备验证数据
	data := map[string]interface{}{
		"username": "hezhi",
		"age":      25,
	}

	// 执行验证
	err := validator.Validate(data)
	if err != nil {
		fmt.Println("验证失败:", err)
	} else {
		fmt.Println("验证通过")
	}
}

2. 自定义验证规则

package main

import (
	"fmt"
	"github.com/hezhizheng/hvalid"
)

func main() {
	validator := hvalid.NewValidator()

	// 自定义验证函数
	isEven := func(value interface{}) bool {
		if num, ok := value.(int); ok {
			return num%2 == 0
		}
		return false
	}

	validator.Field("number").
		Required("数字不能为空").
		Custom(isEven, "数字必须是偶数")

	data := map[string]interface{}{
		"number": 4,
	}

	err := validator.Validate(data)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("验证通过")
	}
}

3. 结构体验证

package main

import (
	"fmt"
	"github.com/hezhizheng/hvalid"
)

type User struct {
	Name  string `json:"name"`
	Email string `json:"email"`
	Age   int    `json:"age"`
}

func main() {
	validator := hvalid.NewValidator()

	validator.Field("name").
		Required("姓名不能为空").
		MinLength(2, "姓名至少2个字符")

	validator.Field("email").
		Required("邮箱不能为空").
		Email("邮箱格式不正确")

	validator.Field("age").
		Required("年龄不能为空").
		Min(18, "年龄必须大于18岁")

	user := User{
		Name:  "张三",
		Email: "zhangsan@example.com",
		Age:   20,
	}

	// 将结构体转为map进行验证
	data := map[string]interface{}{
		"name":  user.Name,
		"email": user.Email,
		"age":   user.Age,
	}

	err := validator.Validate(data)
	if err != nil {
		fmt.Println("验证失败:", err)
	} else {
		fmt.Println("验证通过")
	}
}

高级功能

1. 条件验证

package main

import (
	"fmt"
	"github.com/hezhizheng/hvalid"
)

func main() {
	validator := hvalid.NewValidator()

	validator.Field("password").
		Required("密码不能为空").
		MinLength(6, "密码至少6个字符")

	// 当password不为空时,验证confirm_password
	validator.Field("confirm_password").
		When(func(data map[string]interface{}) bool {
			return data["password"] != nil && data["password"] != ""
		}).
		Required("确认密码不能为空").
		EqualsTo("password", "两次密码不一致")

	data := map[string]interface{}{
		"password":         "123456",
		"confirm_password": "123456",
	}

	err := validator.Validate(data)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("验证通过")
	}
}

2. 嵌套验证

package main

import (
	"fmt"
	"github.com/hezhizheng/hvalid"
)

func main() {
	validator := hvalid.NewValidator()

	// 验证嵌套对象
	validator.Field("address.city").
		Required("城市不能为空")

	validator.Field("address.postal_code").
		Required("邮编不能为空").
		Pattern(`^\d{6}$`, "邮编必须是6位数字")

	data := map[string]interface{}{
		"address": map[string]interface{}{
			"city":       "北京",
			"postal_code": "100000",
		},
	}

	err := validator.Validate(data)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("验证通过")
	}
}

性能优化技巧

  1. 复用验证器:验证器创建后可以复用,避免重复创建
  2. 提前编译规则:复杂的正则表达式可以预编译
  3. 批量验证:对多个字段使用批量验证方法
// 批量验证示例
validator := hvalid.NewValidator()

validator.Batch([]string{"name", "email", "age"}, func(field *hvalid.FieldValidator) {
	field.Required("不能为空")
})

validator.Field("name").MinLength(2, "至少2个字符")
validator.Field("email").Email("邮箱格式不正确")
validator.Field("age").Min(18, "年龄必须大于18岁")

hvalid 是一个简单但功能强大的验证库,适合大多数 Golang 项目的验证需求。它的轻量级设计使得它在性能敏感的应用中表现优异,同时提供了足够的灵活性来处理复杂的验证场景。

回到顶部