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 和值:
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 辅助泛型约束)。
# js
# json
# go
# golang
# ai
# 邮箱
# 键值对
# 标准库
# red
# String
# Float
# 封装
# 字符串
# 结构体
# bool
# int
# 指针
# Length
# Struct
# 泛型
# 数字类型
# 切片
# len
# nil
# map
# 类型转换
# regexp
# column
# 遍历
# 自定义
# 判断是否
# 字段名
# 设为
# 空字符串
# 布尔
# 再用
# 易用
# 关键在于
相关文章:
广州建站公司哪家好?十大优质服务商推荐
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何通过可视化优化提升建站效果?
如何通过WDCP绑定主域名及创建子域名站点?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
建站之星展会模板:智能建站与自助搭建高效解决方案
制作企业网站建设方案,怎样建设一个公司网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
jQuery 常见小例汇总
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
建站主机助手选型指南:2025年热门推荐与高效部署技巧
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
北京制作网站的公司,北京铁路集团官方网站?
Swift中switch语句区间和元组模式匹配
linux top下的 minerd 木马清除方法
如何用免费手机建站系统零基础打造专业网站?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
网站制作公司排行榜,抖音怎样做个人官方网站
建站之星安装需要哪些步骤及注意事项?
如何获取免费开源的自助建站系统源码?
如何在云指建站中生成FTP站点?
如何选择高效便捷的WAP商城建站系统?
建站主机功能解析:服务器选择与快速搭建指南
Python lxml的etree和ElementTree有什么区别
常州企业网站制作公司,全国继续教育网怎么登录?
如何基于云服务器快速搭建个人网站?
购物网站制作公司有哪些,哪个购物网站比较好?
宁波自助建站系统如何快速打造专业企业网站?
如何在腾讯云服务器上快速搭建个人网站?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
再谈Python中的字符串与字符编码(推荐)
建站VPS推荐:2025年高性能服务器配置指南
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星导航菜单设置与功能模块配置全攻略
如何在阿里云虚拟服务器快速搭建网站?
如何用5美元大硬盘VPS安全高效搭建个人网站?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
C#如何在一个XML文件中查找并替换文本内容
外贸公司网站制作哪家好,maersk船公司官网?
C#如何使用XPathNavigator高效查询XML
制作网页的网站有哪些,电脑上怎么做网页?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
c# 在高并发场景下,委托和接口调用的性能对比
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
*请认真填写需求信息,我们会在24小时内与您取得联系。