Go中自定义字段验证需解析validate tag并反射校验:先定义tag格式(如required,min=3),再用strings/strconv解析为map,最后通过reflect遍历字段,按类型执行零值、长度、数值、邮箱等规则校验,失败返回含字段名的错误。

在 Go 中,字段标签(struct tag)是实现运行时元数据注入的常用方式,比如 json:"name"、gorm:"column:name"。要实现自定义的字段验证(如 validate:"required,min=3,max=20"),关键在于:解析结构体字段的 tag 字符串,并按约定规则提取约束条件,再对字段值执行对应校验逻辑。
统一使用 validate key,值为逗号分隔的键值对或布尔标记,例如:
type User struct {
Name string `validate:"required,min=3,max=10"`
Email string `validate:"required,email"`
Age int `validate:"required,gt=0,lt=150"`
}
其中:
– required 表示非空(对字符串/切片/映射/指针等判断是否零值)
– min=3 表示最小长度(字符串)或最小数值(数字)
– email 表示需匹配邮箱正则
– gt=0 表示大于 0(支持 gt、gte、lt、lte)
用标准库 strings 和 strconv 拆解 tag 值,转为 map 或结构体便于后续调用:
, 分割每个 rule(如 "required"、"min=3")= 的 rule,拆成 key 和 value(如 min → "3")= 的 rule,value 设为空字符串(如 required → "")parseValidateTag(tag string) map[string]string
借助 reflect 包获取结构体字段及其 tag 和值:
立即学习“go语言免费学习笔记(深入)”;
FlowMuse AI
节点式AI视觉创作引擎
85
查看详情
validate tag;没有则跳过required:用 reflect.Value.IsZero() 判断是否为零值min/max:对字符串取 .Len(),对数字转为 int64 后比较email:用 regexp.MustCompile(`^.+@.+\..+$`).MatchString()
gt/lt 等:统一转为 float64 比较,兼容 int/uint/float 类型"Name: min=3 failed, got length 2")对外暴露一个通用入口,隐藏反射细节:
func Validate(v interface{}) error {
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
if val.Kind() != reflect.Struct {
return errors.New("Validate only supports struct or *struct")
}
return validateStruct(val)
}
调用示例:
u := User{Name: "A", Email: "invalid", Age: -5}
if err := Validate(&u); err != nil {
log.Println(err) // Name: min=3 failed; Email: email invalid; Age: gt=0 failed
}
不复杂但容易忽略:注意指针解引用、零值判断
边界(如空字符串、nil 切片)、数字类型转换溢出保护(可用 golang.org/x/exp/constraints 辅助泛型约束)。
以上就是如何使用Golang实现字段标签验证_解析tag并执行规则的详细内容,更多请关注其它相关文章!
# json
# js
# 遍历
# 键值
# 如何使用
# 加载
# red
# 标准库
# 键值对
# 邮箱
# ai
# golang
# go
# 网站优化做什么的好
# 平台营销推广公告模板
# 民房建设政策网站查询
# 长春企业网站seo
# 四川加油站营销推广方案
# 遂宁网站推广外包
# 怎么写出符合seo文章标题
# 广安市集团网站建设
# 吴川智能网站建设招标
# SEO优化大家
# 设为
# 如何在
# 字段名
# 判断是否
# 资源管理
# 自定义
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效
深入理解Python对象引用与链表属性赋值
PHP安全加载非公开目录图片与动态内容类型处理指南
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
CodeIgniter 3 连接 SQL Server:正确获取查询结果的教程
三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧
抖音评论无法发送如何修复 抖音评论功能操作指南
XPath动态元素定位:如何精准选择文本内容变化的元素
怎么恢复删除的电脑文件_数据恢复软件使用教程
Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南
PSD转AI文件的简单方法
快递物流路径揭秘
自定义你的VS Code状态栏,监控关键信息
在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享
Python中安全地将环境变量转换为整数的类型注解指南
阿里云共享相册入口在哪
12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧
如何使用 composer 和 aop-php 实现 AOP 编程?
店铺如何做视频号推广?做视频号推广有用吗?
Lar*el Socialite单设备登录策略:实现用户唯一会话管理
J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突
手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧
抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?
快手网页版官方访问 快手网页版页面在线打开
Python模块化编程:避免循环导入与共享函数的最佳实践
画质怪兽120帧安卓和平精英免费版
PHP实现等比数列:构建数组元素基于前一个值递增的方法
附近酒吧怎么找?
微信客户端怎么查看二维码_微信客户端个人二维码查看方法
如何在mysql中使用索引提示_mysql索引提示优化方法
如何测试您的网站全球打开速度-网站海外测速工
解决Flex容器横向滚动内容截断与偏移问题
Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频
《三国:谋定天下》平民全阶段通用阵容
申通快递物流信息查询 申通快递包裹状态追踪
j*a中ArrayBlockingQueue的使用
c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践
搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能
我居然低估了 DeepSeek,这次更新它做到了这些!
嘀嗒顺风车如何开具电子发票
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
Go语言中方法与接收器:指针和值类型的调用机制详解
Yandex浏览器官方入口_Yandex搜索引擎中文版
PDF如何批量加注释_PDF多文件批注高亮操作教程
百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法
抖音团长模式怎么做?团长模式是什么意思?
如何在Golang中处理表单文件上传_Golang 表单文件上传示例
在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示
Composer如何使用composer-plugin-api开发自定义插件
雨课堂官网在线登录 网页版雨课堂登录链接
2025-12-18
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。