412 字
2 分钟
数据验证

基本验证标签#

type User struct {
// 必填字段
Username string `json:"username" binding:"required"`
// 最小长度
Password string `json:"password" binding:"required,min=6"`
// 最大长度
Nickname string `json:"nickname" binding:"max=20"`
// 长度范围
Code string `json:"code" binding:"len=6"`
// 邮箱格式
Email string `json:"email" binding:"required,email"`
// URL 格式
Website string `json:"website" binding:"url"`
// 数字范围
Age int `json:"age" binding:"gte=0,lte=130"`
// 枚举值
Gender string `json:"gender" binding:"oneof=male female other"`
// IP 地址
IP string `json:"ip" binding:"ip"`
// 日期时间
Birthday time.Time `json:"birthday" binding:"required"`
}

常用验证标签#

type Product struct {
// 字符串验证
Name string `binding:"required,min=3,max=100"`
Description string `binding:"omitempty,max=500"`
SKU string `binding:"required,alphanum"`
// 数字验证
Price float64 `binding:"required,gt=0"`
Stock int `binding:"required,gte=0"`
Discount float64 `binding:"omitempty,gte=0,lte=100"`
// 数组验证
Tags []string `binding:"required,min=1,max=10,dive,min=2,max=20"`
// 嵌套结构验证
Category Category `binding:"required"`
}
type Category struct {
ID int `binding:"required,gt=0"`
Name string `binding:"required,min=2,max=50"`
}

自定义验证器#

import (
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
)
// 自定义验证函数
func customValidator(fl validator.FieldLevel) bool {
value := fl.Field().String()
return value == "admin" || value == "user"
}
type RegisterForm struct {
Username string `json:"username" binding:"required"`
Role string `json:"role" binding:"required,customRole"`
}
func main() {
r := gin.Default()
// 注册自定义验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("customRole", customValidator)
}
r.POST("/register", func(c *gin.Context) {
var form RegisterForm
if err := c.ShouldBindJSON(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "Registration successful",
"user": form,
})
})
r.Run(":8080")
}

自定义错误消息#

type LoginForm struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required,min=6"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var form LoginForm
if err := c.ShouldBindJSON(&form); err != nil {
// 自定义错误消息
errors := make(map[string]string)
for _, fieldErr := range err.(validator.ValidationErrors) {
field := fieldErr.Field()
tag := fieldErr.Tag()
switch field {
case "Username":
if tag == "required" {
errors[field] = "用户名不能为空"
}
case "Password":
if tag == "required" {
errors[field] = "密码不能为空"
} else if tag == "min" {
errors[field] = "密码长度至少为 6 位"
}
}
}
c.JSON(http.StatusBadRequest, gin.H{
"errors": errors,
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "登录成功",
})
})
r.Run(":8080")
}
数据验证
https://shirone.mysqil.com/posts/gin/数据验证/
作者
HikariTish
发布于
2026-07-18
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取