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 ./...

贡献

欢迎提交问题和拉取请求来改进 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 数据验证库,专注于简单易用和高效验证。下面我将介绍它的基本用法和示例代码。

安装

go get github.com/hezhizhen/hvalid

基本用法

1. 简单验证

package main

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

func main() {
	// 验证字符串不为空
	err := hvalid.Validate("username", 
		hvalid.String().NotBlank().MinLen(3).MaxLen(20))
	if err != nil {
		fmt.Println(err) // 输出验证错误
	}

	// 验证数字范围
	err = hvalid.Validate(25, 
		hvalid.Number().Min(18).Max(60))
	if err != nil {
		fmt.Println(err)
	}
}

2. 结构体验证

type User struct {
	Username string `json:"username"`
	Age      int    `json:"age"`
	Email    string `json:"email"`
}

func main() {
	user := User{
		Username: "hzh",
		Age:      17,
		Email:    "test@example.com",
	}

	rules := hvalid.Rules{
		"username": hvalid.String().NotBlank().MinLen(3).MaxLen(20),
		"age":      hvalid.Number().Min(18).Msg("年龄必须大于等于18岁"),
		"email":    hvalid.String().IsEmail(),
	}

	err := hvalid.ValidateStruct(user, rules)
	if err != nil {
		fmt.Println(err)
		// 输出: age: 年龄必须大于等于18岁
	}
}

3. 自定义验证规则

func main() {
	// 自定义密码强度验证
	password := "Abc123"
	
	customRule := hvalid.NewStringRule().
		MinLen(6).
		Custom(func(s string) error {
			// 检查是否包含数字
			hasNumber := false
			// 检查是否包含大写字母
			hasUpper := false
			
			for _, c := range s {
				if c >= '0' && c <= '9' {
					hasNumber = true
				}
				if c >= 'A' && c <= 'Z' {
					hasUpper = true
				}
			}
			
			if !hasNumber || !hasUpper {
				return fmt.Errorf("密码必须包含数字和大写字母")
			}
			return nil
		})
	
	err := hvalid.Validate(password, customRule)
	if err != nil {
		fmt.Println(err)
	}
}

4. 切片验证

func main() {
	tags := []string{"golang", "programming", "", "dev"}
	
	err := hvalid.Validate(tags, 
		hvalid.Slice().Each(hvalid.String().NotBlank()))
	if err != nil {
		fmt.Println(err) // 输出: [2]: 不能为空
	}
}

5. 条件验证

type Order struct {
	PaymentMethod string `json:"payment_method"`
	CreditCard    string `json:"credit_card"`
}

func main() {
	order := Order{
		PaymentMethod: "credit_card",
		CreditCard:    "",
	}

	rules := hvalid.Rules{
		"payment_method": hvalid.String().In("credit_card", "paypal", "wechat"),
		"credit_card": hvalid.String().
			When(order.PaymentMethod == "credit_card").
			NotBlank().Msg("信用卡支付必须填写信用卡号"),
	}

	err := hvalid.ValidateStruct(order, rules)
	if err != nil {
		fmt.Println(err) // 输出: credit_card: 信用卡支付必须填写信用卡号
	}
}

高级特性

1. 嵌套结构体验证

type Address struct {
	Street  string `json:"street"`
	City    string `json:"city"`
	ZipCode string `json:"zip_code"`
}

type Customer struct {
	Name    string  `json:"name"`
	Age     int     `json:"age"`
	Address Address `json:"address"`
}

func main() {
	customer := Customer{
		Name: "Alice",
		Age:  25,
		Address: Address{
			Street:  "",
			City:    "New York",
			ZipCode: "10001",
		},
	}

	rules := hvalid.Rules{
		"name": hvalid.String().NotBlank(),
		"age":  hvalid.Number().Min(18),
		"address": hvalid.Rules{
			"street":  hvalid.String().NotBlank(),
			"city":    hvalid.String().NotBlank(),
			"zip_code": hvalid.String().Match(`^\d{5}$`),
		},
	}

	err := hvalid.ValidateStruct(customer, rules)
	if err != nil {
		fmt.Println(err) // 输出: address.street: 不能为空
	}
}

2. 验证器复用

var (
	usernameValidator = hvalid.String().NotBlank().MinLen(3).MaxLen(20)
	emailValidator    = hvalid.String().IsEmail()
	ageValidator      = hvalid.Number().Min(18)
)

func main() {
	user := map[string]interface{}{
		"username": "hzh",
		"email":    "invalid-email",
		"age":      16,
	}

	rules := hvalid.Rules{
		"username": usernameValidator,
		"email":    emailValidator,
		"age":      ageValidator.Msg("必须年满18岁"),
	}

	err := hvalid.ValidateMap(user, rules)
	if err != nil {
		fmt.Println(err)
		// 输出:
		// email: 必须是有效的邮箱地址
		// age: 必须年满18岁
	}
}

性能考虑

hvalid 在设计上考虑了性能因素:

  1. 使用链式调用减少中间对象创建
  2. 提前终止验证(遇到第一个错误即返回)
  3. 避免不必要的反射操作

总结

hvalid 提供了简洁直观的 API 来进行各种数据验证,包括:

  • 基本类型验证(字符串、数字等)
  • 结构体和嵌套结构体验证
  • 条件验证
  • 自定义验证规则
  • 切片/数组验证

它的轻量级设计使其非常适合在微服务或高性能应用中使用,同时保持了足够的灵活性来处理复杂的验证场景。

回到顶部