多字段联合校验需将相关字段作为整体传入自定义函数,推荐在结构体上定义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
# 自定义
# 多字
# 表单
# 晚于
# 推荐在
# 并在
# 仍是
# 可通过
# 第三方
# 不把
相关文章:
PHP 500报错的快速解决方法
建站之星CMS五站合一模板配置与SEO优化指南
网站制作难吗安全吗,做一个网站需要多久时间?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何选择适配移动端的WAP自助建站平台?
如何高效完成自助建站业务培训?
如何在IIS管理器中快速创建并配置网站?
如何通过西部数码建站助手快速创建专业网站?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
简历在线制作网站免费,免费下载个人简历的网站是哪些?
ui设计制作网站有哪些,手机UI设计网址吗?
如何通过IIS搭建网站并配置访问权限?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何在云主机上快速搭建多站点网站?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何在阿里云服务器自主搭建网站?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
c# 在ASP.NET Core中管理和取消后台任务
网站制作费用多少钱,一个网站的运营,需要哪些费用?
建站上传速度慢?如何优化加速网站加载效率?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
如何访问已购建站主机并解决登录问题?
如何选择网络建站服务器?高效建站必看指南
网站app免费制作软件,能免费看各大网站视频的手机app?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
网站制作需要会哪些技术,建立一个网站要花费多少?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星如何保障用户数据免受黑客入侵?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何通过主机屋免费建站教程十分钟搭建网站?
独立制作一个网站多少钱,建立网站需要花多少钱?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
学校建站服务器如何选型才能满足性能需求?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
实现点击下箭头变上箭头来回切换的两种方法【推荐】
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
如何选择靠谱的建站公司加盟品牌?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何破解联通资金短缺导致的基站建设难题?
建站之星如何修改网站生成路径?
太原网站制作公司有哪些,网约车营运证查询官网?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
常州自助建站费用包含哪些项目?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
*请认真填写需求信息,我们会在24小时内与您取得联系。