如何在Golang中处理结构体字段错误_Golang字段验证与异常管理
发布时间 - 2026-01-07 00:00:00 点击率:次应使用 go-playground/validator 库,它支持标签驱动、嵌套校验和自定义规则,且无运行时依赖;避免使用已归档的 asaskevich/govalidator。
结构体字段验证该用哪个库
Go 标准库不提供字段级验证,encoding/json 和 reflect 仅支持基础序列化与反射,不做校验。生产项目普遍用 go-playground/validator,它支持标签驱动、嵌套结构、自定义规则,且无运行时依赖。别用 asaskevich/govalidator —— 已归档,不维护,Validate 方法在 Go 1.21+ 下有 panic 风险。
validator 标签怎么写才不出错
标签必须写在 struct 字段后、反引号内,且不能拼错字段名或参数。常见错误是把 required 写成 require,或漏掉 json 标签导致反序列化后字段为空但验证跳过。
type User struct {
ID int `json:"id" validate:"required,gt=0"`
Name string `json:"name" validate:"required,min=2,max=20"`
Email string `json:"email" validate:"required,email"`
Age uint8 `json:"age" validate:"gte=0,lte=150"`
}
-
required只检查零值(""、0、nil),对指针字段要加omitempty或用required_if -
email不校验 DNS 或 MX 记录,只做格式正则匹配 - 嵌套结构需在字段上加
validate:"required",并在类型定义里也加 validator 标签,否则Struct不递归校验
验证失败后怎么拿具体字段和错误
直接调 Vali 返回
date.Struct()error,但它是封装过的 validator.ValidationErrors 类型,不能用 fmt.Errorf 直接打印字段名。必须类型断言并遍历:
err := validate.Struct(user)
if err != nil {
if errs, ok := err.(validator.ValidationErrors); ok {
for _, e := range errs {
fmt.Printf("field: %s, tag: %s, value: %v\n", e.Field(), e.Tag(), e.Value())
}
}
}
-
e.Field()返回结构体字段名(如"Name"),不是 JSON key("name") -
e.Param()可取min、max等参数值,用于动态提示 - 若需返回 HTTP 错误,建议映射为 map[string]string:键用
e.StructNamespace()提取路径(如"User.Email"),避免前端无法定位嵌套字段
自定义验证函数怎么注册和触发
比如限制手机号必须是大陆 11 位数字,不能只靠正则标签——得注册函数,并在 tag 中引用函数名:
validate.RegisterValidation("chinese_mobile", func(fl validator.FieldLevel) bool {
s := fl.Field().String()
return regexp.MustCompile(`^1[3-9]\d{9}$`).MatchString(s)
})
// 使用
type User struct {
Mobile string `validate:"chinese_mobile"`
}
- 函数名必须全小写,tag 中也写小写,否则注册无效
-
fl.Field()返回reflect.Value,对指针字段要先fl.Field().Elem() - 不要在验证函数里 panic,validator 不 recover;出错应返回
false,错误信息靠RegisterTranslation补充
最易被忽略的是:validator 默认不校验 nil 指针字段,哪怕你写了 required。如果字段是 *string,必须显式加 nonnil 标签,或改用 required_with 组合逻辑。
# js
# 前端
# json
# go
# golang
# ai
# dns
# 标准库
# red
# String
# 封装
# require
# Error
# 结构体
# 递归
# 指针
# Struct
# nil
# map
# http
# 自定义
# 并在
# 字段名
# 的是
# 遍历
# 它是
# 写了
# 不做
# 中也
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何为不同团队 ID 动态生成多个独立按钮
北京网站制作的公司有哪些,北京白云观官方网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
如何在阿里云ECS服务器部署织梦CMS网站?
如何破解联通资金短缺导致的基站建设难题?
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Android利用动画实现背景逐渐变暗
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何使用Telescope进行调试?(安装和使用教程)
Python面向对象测试方法_mock解析【教程】
如何在Windows服务器上快速搭建网站?
香港服务器部署网站为何提示未备案?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
EditPlus中的正则表达式 实战(1)
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
微信公众帐号开发教程之图文消息全攻略
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Python正则表达式进阶教程_复杂匹配与分组替换解析
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Java解压缩zip - 解压缩多个文件或文件夹实例
Internet Explorer官网直接进入 IE浏览器在线体验版网址
浅谈redis在项目中的应用
香港网站服务器数量如何影响SEO优化效果?
如何为不同团队 ID 动态生成多个“认领值班”按钮
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Python进程池调度策略_任务分发说明【指导】
简历在线制作网站免费版,如何创建个人简历?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
WEB开发之注册页面验证码倒计时代码的实现
Laravel如何实现用户密码重置功能?(完整流程代码)
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
七夕网站制作视频,七夕大促活动怎么报名?
网站制作报价单模板图片,小松挖机官方网站报价?
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
如何在建站之星绑定自定义域名?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
JavaScript常见的五种数组去重的方式
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
iOS验证手机号的正则表达式
上一篇:怎么重新安装phpstudy
上一篇:怎么重新安装phpstudy

