首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >每日一库:Govalidator —— Go 语言的强大验证与清理工具​

每日一库:Govalidator —— Go 语言的强大验证与清理工具​

作者头像
七点一刻
发布2026-03-18 19:01:54
发布2026-03-18 19:01:54
830
举报

概述

Govalidator是一个 Go 语言库,专注于数据验证与清理,支持字符串、数字、切片、结构体及嵌套数据。灵感来源于 JavaScript 的validator.js,它提供了丰富的内置验证函数,同时支持灵活的自定义扩展。

  • •GitHub - http://github.com/asaskevich/govalidator

核心功能

1.安装与导入

代码语言:javascript
复制
go get github.com/asaskevich/govalidator

导入到代码:

代码语言:javascript
复制
import "github.com/asaskevich/govalidator"

2.强制字段验证 • 启用SetFieldsRequiredByDefault(true)后,所有结构体字段需显式标记valid标签,否则验证失败。 • 例外:使用valid:"-"valid:"email,optional"跳过验证或设为可选。

3.内置验证器字符串IsURLIsEmailIsIPv4IsCreditCard等。 •数值IsIntIsFloatInRange。 •格式IsJSONIsBase64IsUUID。 •国际化IsUTFLetterIsFullWidth。 •完整列表:超过 70 种验证函数,覆盖常见需求。

4.结构体验证

代码语言:javascript
复制
type User struct {
    Name  string `valid:"required,alpha"`
    Email string `valid:"email"`
}
isValid, err := govalidator.ValidateStruct(User{Name: "Bob", Email: "bob@example.com"})

5.Map 验证

代码语言:javascript
复制
template := map[string]interface{}{
    "name": "required,alpha",
    "age":  "numeric,range(18|99)",
}
input := map[string]interface{}{"name": "Alice", "age": 25}
isValid, err := govalidator.ValidateMap(input, template)

6.自定义验证器无参数验证器

代码语言:javascript
复制
govalidator.TagMap["isDuck"] = govalidator.Validator(func(str string) bool {
    return str == "duck"
})

带参数验证器

代码语言:javascript
复制
govalidator.ParamTagMap["animal"] = govalidator.ParamValidator(func(str string, params ...string) bool {
    return str == params[0]
})

7.错误处理 • 自定义错误消息:

代码语言:javascript
复制
type Ticket struct {
    Name string `valid:"required~Name cannot be empty"`
}

• 遍历多错误:

代码语言:javascript
复制
if errs, ok := err.(govalidator.Errors); ok {
    for _, e := range errs.Errors() {
        fmt.Println(e.Error())
    }
}

8.辅助工具字符串处理TrimPadLeftReverseWhiteList(过滤字符)。 •切片操作EachMapFilterCount。 •类型转换ToBooleanToFloatToString


使用场景

API 请求验证:确保输入数据符合预期格式。 •数据清洗:过滤非法字符或格式化字符串。 •复杂结构校验:嵌套结构体或动态 Map 数据的规则验证。 •国际化支持:处理多语言字符集的验证需求。


注意事项

破坏性变更:v 10 版本后,自定义验证函数需接收上下文参数func(i interface{}, o interface{}) bool,以支持依赖验证。 •性能:大量数据验证时注意性能,可结合基准测试优化。 •错误消息:优先使用自定义错误提升可读性。


示例代码

代码语言:javascript
复制
package main

import (
    "fmt"
    "github.com/asaskevich/govalidator"
)

func init() {
    govalidator.SetFieldsRequiredByDefault(true)
}

type Product struct {
    ID    string`valid:"required,uuidv4"`
    Name  string`valid:"required,alpha"`
    Price float64`valid:"required,range(10|1000)"`
}

func main() {
    p := Product{ID: "bad-id", Name: "Laptop123", Price: 5.0}
    isValid, err := govalidator.ValidateStruct(p)
    if err != nil {
        for _, e := range err.(govalidator.Errors).Errors() {
            fmt.Println("Error:", e)
        }
    }
    fmt.Println("Is valid?", isValid)
}
// 输出:
// Error: ID must be a valid UUIDv4
// Error: Name must contain alphabetic characters only
// Error: Price must be between 10 and 1000
// Is valid? false

总结

Govalidator是 Go 生态中功能全面的验证库,适合需要严格数据校验的场景。通过组合内置规则与自定义逻辑,可轻松应对复杂业务需求。使用时注意版本升级的变更,合理设计验证规则以平衡灵活性与性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七点一刻的魔法书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 核心功能
  • 使用场景
  • 注意事项
  • 示例代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档