多字段联合校验需将相关字段作为整体传入自定义函数,推荐在结构体上定义Validate()方法封装逻辑;如BookingForm中校验StartTime不早于当前时间、EndTime晚于StartTime、VenueType为physical时AttendeeCount≥1。
Go 本身没有内置表单验证框架,但联合校验的关键在于:**不把每个字段孤立验证,而是将相关字段作为整体传入一个自定义校验函数**。比如“开始时间不能晚于结束时间”“密码和确认密码必须一致”“当类型为 email 时,格式需合法”,这些都依赖字段间的逻辑关系,无法靠单字段 tag(如 `validate:"required,email"`)解决。
推荐在结构体上定义 Validate() 方法,把跨字段判断写在里面。这样语义清晰、易于测试,也避免校验逻辑散落在 handler 中。
error(可自定义错误类型,带字段名和原因)假设表单含 StartTime、EndTime、AttendeeCount、VenueType,要求:
实现方式如下:
func (f *BookingForm) Validate() error {
now := time.Now()
if !f.StartTime.After(now) && !f.StartTime.Equal(now) {
return fmt.Errorf("start_time must be now or later")
}
if !f.EndTime.After(f.StartTime) {
return fmt.Errorf("end_time must be after start_time")
}
if f.VenueType != "online" && f.AttendeeCount < 1 {
return fmt.Errorf("attendee_count must be >= 1 for physical venue")
}
return nil
}
在 handler 中直接调用:if err := form.Validate(); err != nil { ... }
对简单字段仍可用 go-playground/validator 的 tag(如 `required,gtfield=StartTime`),它原生支持部分跨字段比较(gtfield、ltefield 等)。但复杂逻辑(如条件分支)仍需自定义函数:
import "github.com/go-playground/validator/v10"
func init() {
validate.RegisterValidation("venue_count_valid", func(fl validator.FieldLevel) bool {
form := fl.Parent().Interface().(BookingForm)
if form.VenueType == "online" {
return true // 允许为 0
}
return form.AttendeeCount >= 1
})
}
// struct tag 使用
type BookingForm struct {
StartTime time.Time `validate:"required,gtfield=Now"`
EndTime time.Time `validate:"required,gtfield=StartTime"`
AttendeeCount int `validate:"venue_count_valid"`
VenueType string `validate:"oneof=online physical"`
}
注意:gtfield=Now 需手动注入当前时间(通过 fl.Parent().FieldByName("Now") 或预设字段),更稳妥的做法仍是结构体方法 + 手动传参。
# git
# go
# github
# golang
# ai
# red
# String
# if
# 封装
# 表单验证
# Error
# 结构体
# 指针
# Struct
# nil
# 自定义
# 多字
# 表单
# 晚于
# 推荐在
# 并在
# 仍是
# 可通过
# 第三方
# 不把
相关文章:
东莞专业制作网站的公司,东莞大学生网的网址是什么?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
为什么Go需要go mod文件_Go go mod文件作用说明
公司网站制作需要多少钱,找人做公司网站需要多少钱?
已有域名和空间如何搭建网站?
如何确保FTP站点访问权限与数据传输安全?
如何在香港服务器上快速搭建免备案网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
建站之星如何防范黑客攻击与数据泄露?
网站制作需要会哪些技术,建立一个网站要花费多少?
利用JavaScript实现拖拽改变元素大小
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何选择适合PHP云建站的开源框架?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建站之星如何取消后台验证码生成?
制作网站的公司有哪些,做一个公司网站要多少钱?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何在云服务器上快速搭建个人网站?
Thinkphp 中 distinct 的用法解析
如何用美橙互联一键搭建多站合一网站?
相册网站制作软件,图片上的网址怎么复制?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何快速搭建高效服务器建站系统?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
制作门户网站的参考文献在哪,小说网站怎么建立?
如何在建站主机中优化服务器配置?
建站之星备案流程有哪些注意事项?
如何通过虚拟主机快速完成网站搭建?
移民网站制作流程,怎么看加拿大移民官网?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
大连网站制作公司哪家好一点,大连买房网站哪个好?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
广州美橙建站如何快速搭建多端合一网站?
定制建站流程步骤详解:一站式方案设计与开发指南
金*站制作公司有哪些,金华教育集团官网?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
公司网站设计制作厂家,怎么创建自己的一个网站?
,网页ppt怎么弄成自己的ppt?
建站之星安装提示数据库无法连接如何解决?
,柠檬视频怎样兑换vip?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
网站图片在线制作软件,怎么在图片上做链接?
如何用wdcp快速搭建高效网站?
建站之星如何快速解决建站难题?
如何通过网站建站时间优化SEO与用户体验?
如何快速查询网站的真实建站时间?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
三星网站视频制作教程下载,三星w23网页如何全屏?
*请认真填写需求信息,我们会在24小时内与您取得联系。