• Go 语言结构体验证详解:validate 标签与自定义规则


    介绍

            Go 语言中,结构体验证是保障数据完整性和正确性的重要手段之一。本文将深入探讨 validate 标签的使用方式,并介绍如何结合验证库 go-playground/validator 进行自定义验证规则。

    安装与导入验证库

    首先,请确保已安装验证库:

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

    在代码中导入验证库:

    import "github.com/go-playground/validator/v10"

    基本用法

    使用 validate 标签为结构体字段定义基本验证规则:

    1. type User struct {
    2. Username string `validate:"required,min=3,max=20"`
    3. Email string `validate:"required,email"`
    4. Age int `validate:"gte=18"`
    5. }

    在上述示例中:

    • required 表示字段值不能为空。
    • min=3max=20 表示字符串长度必须在 3 到 20 之间。
    • email 要求字段值是有效的电子邮件地址。
    • gte=18 表示数字字段必须大于等于 18。

    自定义验证规则

    为了满足特定业务需求,我们可以定义自己的验证规则。首先,创建一个自定义验证函数:

    1. func customRule(fl validator.FieldLevel) bool {
    2. // 自定义验证逻辑,返回 true 表示验证通过,false 表示验证失败
    3. value := fl.Field().String()
    4. return value == "custom_value"
    5. }

    然后,在结构体字段的 validate 标签中引用这个函数:

    1. type MyStruct struct {
    2. CustomField string `validate:"customRule"`
    3. }

    嵌套结构体验证

    验证库支持嵌套结构体的验证。例如,如果有一个嵌套的 Address 结构体:

    1. type User struct {
    2. Username string `validate:"required"`
    3. Email string `validate:"required,email"`
    4. Address Address `validate:"required"`
    5. }
    6. type Address struct {
    7. Street string `validate:"required"`
    8. City string `validate:"required"`
    9. }

    在这个例子中,Address 结构体的验证规则会被嵌套到 User 结构体的验证中。

    切片和数组的元素验证

    对于切片和数组,我们可以使用 dive 标签进行元素级别的验证:

    1. type MyStruct struct {
    2. Numbers []int `validate:"required,dive,gte=0,lte=100"`
    3. }

    这表示 Numbers 切片中的每个元素必须在 0 到 100 之间。

    自定义错误消息

    我们可以为每个验证规则定义自定义的错误消息:

    1. type User struct {
    2. Username string `validate:"required,min=3,max=20" error:"用户名不能为空,长度必须在3到20之间"`
    3. }

    在这个例子中,如果验证失败,将使用自定义的错误消息而不是默认的错误消息。

    使用验证器进行验证

    创建验证器实例,使用其 Struct 方法进行结构体验证:

    1. func main() {
    2. validate := validator.New()
    3. user := User{
    4. Username: "john_doe",
    5. Email: "john@example.com",
    6. Address: Address{
    7. Street: "123 Main St",
    8. City: "Anytown",
    9. },
    10. }
    11. if err := validate.Struct(user); err != nil {
    12. // 处理验证错误
    13. for _, err := range err.(validator.ValidationErrors) {
    14. fmt.Println(err.Field(), err.Tag(), err.Param(), err.ActualTag(), err.Namespace())
    15. }
    16. return
    17. }
    18. fmt.Println("Validation passed!")
    19. }

    在验证失败时,我们可以获取每个字段的详细错误信息,进行进一步的处理。

    结论

            通过 validate 标签与验证库的结合,我们可以方便地定义和执行验证规则,确保数据的完整性和正确性。自定义验证规则、嵌套结构体验证、切片和数组元素验证等功能为开发者提供了更多灵活性,让结构体验证更加强大。

  • 相关阅读:
    LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
    Vue基础(七)——数据交互(Ajax)
    Qt之显示PDF文件
    IDA* AcWing 180. 排书
    minio之docker安装
    牛客网专项练习30天Pytnon篇第16天
    中国芯片独角兽公司
    CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)
    Android三种数据存储的方式
    20231009比赛总结
  • 原文地址:https://blog.csdn.net/weixin_41860630/article/details/134482705