gin表单验证struct tag

本文是对 validate tag not working in ShouldBindWith 的回答。

有人提了这么一个问题:

golang 复制代码
package main

import (
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

// MyStruct ..
type MyStruct struct {
	Order string `form:"order,default=DESC" validate:"omitempty,oneof=ASC DESC"`
}

func startPage(c *gin.Context) {
	var person MyStruct
	if c.ShouldBindWith(&person, binding.Query) == nil {
		log.Println("====== Only Bind By Query String ======")
		log.Println(person.Order)
		c.String(http.StatusOK, "Success")
		return
		// log.Println(person.Address)
	}
	c.String(http.StatusBadRequest, "Failed")
	return
}

func main() {

	route := gin.Default()
	route.Any("/testing", startPage)
	route.Run(":8085")
}

然后表单验证的时候,明明 Order 传递了一个不符合 oneof=ASC DESC 的值,但却验证通过了。

原因

虽然 gin 使用了 go-playground/validator 来作为表单验证的组件,但是在 gin 里面却修改了 struct 验证的 tagname,我们可以看看 default_validator.go#L95

golang 复制代码
func (v *defaultValidator) lazyinit() {
	v.once.Do(func() {
		v.validate = validator.New()
		v.validate.SetTagName("binding")
	})
}

然后,我们就不能通过给 struct 加上 vaidate 的 tag 来写上我们的验证规则,取而代之的是,需要将我们的验证规则写在 binding 这个 tag 里面:

validate:"omitempty,oneof=ASC DESC" 替换成 binding:"omitempty,oneof=ASC DESC",我们即可实现在 gin 中使用 validator 验证我们的 struct。

golang 复制代码
type MyStruct struct {
	Order string `form:"order,default=DESC" binding:"omitempty,oneof=ASC DESC"`
}

参考官方文档:
模型绑定和验证

相关推荐
默默敲代码的徐哥儿9 分钟前
八股文整理——后端
java·开发语言·spring boot·后端·学习
matlab代码16 分钟前
基于matlab人脸门禁识别系统(可增加其它人脸图像)源码40期】
开发语言·matlab·人脸识别·人脸门禁
李少兄1 小时前
Java CompletableFuture 解析(含常见面试题)
java·开发语言
逝水无殇1 小时前
C# 枚举(Enum)详解
开发语言·后端·c#
nianniannnn1 小时前
c++复习自存--标准模板库STL
开发语言·c++·windows
努力努力再努力wz2 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
什巳2 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
lang201509282 小时前
Apache POI Word(docx) 实战教程:从入门到精通表格合并、图片插入与文档合并
java·开发语言·word
北冥you鱼2 小时前
Go语言sync包在区块链开发中的数据同步实践
golang·centos·区块链
鱼毓屿御3 小时前
Python 装饰器与函数调用机制(复习笔记 · 2026-07-07)
开发语言·python