Skip to main content

validator 标签

type User struct {
    Name     string `json:"name" binding:"required,min=2,max=50"`
    Email    string `json:"email" binding:"required,email"`
    Age      int    `json:"age" binding:"gte=0,lte=150"`
    Password string `json:"password" binding:"required,min=6"`
    Phone    string `json:"phone" binding:"required,len=11"`
}

常用验证规则

标签说明
required必填
min=n最小长度/值
max=n最大长度/值
len=n长度等于
eq=n等于
ne=n不等于
gt=n大于
gte=n大于等于
lt=n小于
lte=n小于等于
oneof=a b c枚举值
email邮箱格式
urlURL 格式
uuidUUID 格式
datetime=layout日期时间格式
contains=s包含字符串
excludes=s不包含字符串
startswith=s以…开头
endswith=s以…结尾

自定义验证器

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

// 自定义验证函数
func validatePhone(fl validator.FieldLevel) bool {
    phone := fl.Field().String()
    matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, phone)
    return matched
}

// 注册验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
    v.RegisterValidation("phone", validatePhone)
}

// 使用
type User struct {
    Phone string `json:"phone" binding:"required,phone"`
}

自定义错误消息

import (
    "github.com/go-playground/validator/v10"
    "github.com/gin-gonic/gin/binding"
)

// 翻译错误消息
func translateError(err error) string {
    if errs, ok := err.(validator.ValidationErrors); ok {
        var messages []string
        for _, e := range errs {
            switch e.Tag() {
            case "required":
                messages = append(messages, fmt.Sprintf("%s 不能为空", e.Field()))
            case "email":
                messages = append(messages, fmt.Sprintf("%s 格式不正确", e.Field()))
            case "min":
                messages = append(messages, fmt.Sprintf("%s 长度不能小于 %s", e.Field(), e.Param()))
            default:
                messages = append(messages, fmt.Sprintf("%s 验证失败", e.Field()))
            }
        }
        return strings.Join(messages, "; ")
    }
    return err.Error()
}

// 使用
r.POST("/users", func(c *gin.Context) {
    var req CreateUserRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(400, gin.H{"error": translateError(err)})
        return
    }
    // ...
})