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 在设计上考虑了性能因素:
- 使用链式调用减少中间对象创建
- 提前终止验证(遇到第一个错误即返回)
- 避免不必要的反射操作
总结
hvalid 提供了简洁直观的 API 来进行各种数据验证,包括:
- 基本类型验证(字符串、数字等)
- 结构体和嵌套结构体验证
- 条件验证
- 自定义验证规则
- 切片/数组验证
它的轻量级设计使其非常适合在微服务或高性能应用中使用,同时保持了足够的灵活性来处理复杂的验证场景。