Golang使用 go-playground/validator/v10 校验结构体字段

  • 安装
    go get github.com/go-playground/validator/v10
  • 基础示例
    package main
    
    import (
        "fmt"
    
        "github.com/go-playground/validator/v10"
    )
    
    type User struct {
        Name string `validate:"required"`
    }
    
    func main() {
        user := User{
            Name: "张三",
        }
        validate := validator.New()
        err := validate.Struct(user)
        if err != nil {
            // 处理验证错误
            fmt.Println(err.Error())
            return
        }
        fmt.Println("校验通过")
    }
  • 标签基本规则
    逗号(,): 把多个验证标记分开,中间不能有空格,会从左到右按标记验证。
    横线(-): 忽略该字段。
    竖线(|): 把多个验证标记分开,只要满足其中一个即可。
  • 常用标签
    1.通用校验
    required: 不能为字段类型的零值。
    omitempty: 如果字段为类型零值,则不应用校验规则,只影响排在它右边的验证规则。

    2.字符串校验

    min=n: 最小长度n
    max=n: 最大长度n
    len=n: 固定长度n
    alpha: 仅字母(A-Z和a-z)组成
    alphanum: 仅字母和数字字符组成
    numeric: 纯数字字符组成
    email: 有效的邮箱格式
    url: 有效的url格式
    uuid: 有效的uuid格式
    datetime=f: 符合f格式的字符串时间,比如2006-01-02
    eq=v: 等于v,不需要加引号
    ne=v: 不等于v,不需要加引号
    oneof=a b c: 必须是a、b、c中的一个,不需要加引号
    contains=v: 字符串包含v
    excludes=v: 字符串不包含v
    startswith=v: 字符串以v开头
    endswith=v: 字符串以v结尾

    3.数值校验

    gt=n: 大于n
    gte=n: 大于等于n
    lt=n: 小于n
    lte=n: 小于等于n
    eq=n: 等于n
    ne=n: 不等于n
    oneof=a b c: 必须是a、b、c中的一个

    4.切片校验

    min=n: 切片最小长度n
    max=n: 切片最大长度n
    len=n: 切片固定长度n
    unique: 切片中的元素不能重复(数组也可用)

    5.映射(map)校验

    keys,endkeys
    使用规则: keys,[键验证规则],endkeys,[值验证规则]。需要配合dive开启深度校验。
    比如: dive,keys,min=1,max=100,endkeys,required,min=1,max=100

    6.深度校验

    dive: 开启深度校验
    使用规则: 遇到切片、数组、映射时,需要使用dive开启深度校验。
    举例:
        - "[]string"类型字段校验: validate:"required,dive,min=2",表示切片内字符串的长度不能小于2。
        - "[]结构体"类型字段校验: validate:"required,dive", 切片内结构体的字段上设置的校验标签会被执行。
        - map类型字段校验: 参考前面的映射校验
    注意:
        对于结构体嵌套,不需要加dive,会自动执行子结构体字段设置的校验规则。
        如果子结构体定义了校验规则,但是不希望这些规则执行,那么在父结构体的相应字段上添加binding:"structonly"标签即可。

    7.同结构体跨字段校验

    eqfield=同结构体字段名: 表示当前字段值要与指定的字段值相等。
    nefield=同结构体字段名: 表示当前字段值要与指定的字段值不相等。
    gtefield=同结构体字段名: 表示当前字段值要大于等于指定字段值。
    ltefield=同结构体字段名:  表示当前字段值要小于等于指定字段值。

     



posted @ 2025-08-27 10:14  CJTARRR  阅读(40)  评论(0)    收藏  举报