binding 和 msg 是结构体标签(struct tags),主要用于数据验证和错误信息提示。它们通常与 gin 框架的 shouldbindjson 配合使用,以及用于处理表单验证。
下面详细解释:
基本用法示例:
type loginform struct {
username string `json:"username" binding:"required" msg:"用户名不能为空"`
password string `json:"password" binding:"required,min=6" msg:"密码不能为空且长度至少6位"`
age int `json:"age" binding:"required,gte=18" msg:"年龄必须大于或等于18岁"`
email string `json:"email" binding:"required,email" msg:"请输入有效的邮箱地址"`
}在 gin 中使用:
func login(c *gin.context) {
var form loginform
if err := c.shouldbindjson(&form); err != nil {
c.json(400, gin.h{"error": err.error()})
return
}
// 处理登录逻辑...
}常用的 binding 验证规则:
type user struct {
// required: 必填
name string `binding:"required"`
// min,max: 字符串长度或数字范围
password string `binding:"min=6,max=20"`
// email: 邮箱格式
email string `binding:"email"`
// oneof: 枚举值
role string `binding:"oneof=admin user guest"`
// gte,lte: 大于等于,小于等于
age int `binding:"gte=18,lte=100"`
// url: url格式
website string `binding:"url"`
// 正则表达式
phone string `binding:"required,regexp=^1[3-9]\\d{9}$"`
}自定义验证器:
type registerform struct {
password string `binding:"required,custompassword"`
phone string `binding:"required,customphone"`
}
func customvalidator() {
if v, ok := binding.validator.engine().(*validator.validate); ok {
// 注册自定义验证器
v.registervalidation("custompassword", validatepassword)
v.registervalidation("customphone", validatephone)
}
}
func validatepassword(fl validator.fieldlevel) bool {
password := fl.field().string()
// 自定义密码验证逻辑
return len(password) >= 8
}使用 msg 标签自定义错误信息:
type createuserform struct {
username string `json:"username" binding:"required" msg:"用户名不能为空"`
password string `json:"password" binding:"required,min=6" msg:"密码长度最少6位"`
}
// 处理错误信息的辅助函数
func getvalidmsg(err error, obj interface{}) string {
// 通过反射获取 struct 类型
getobj := reflect.typeof(obj)
// 如果是指针,则获取其基础类型
if getobj.kind() == reflect.ptr {
getobj = getobj.elem()
}
// 将错误信息转换为验证器错误
if errs, ok := err.(validator.validationerrors); ok {
// 遍历每一个错误
for _, e := range errs {
// 获取对应字段
if f, exist := getobj.fieldbyname(e.field()); exist {
// 获取 msg 标签内容
msg := f.tag.get("msg")
if msg != "" {
return msg
}
}
}
}
return err.error()
}在控制器中使用:
func createuser(c *gin.context) {
var form createuserform
if err := c.shouldbindjson(&form); err != nil {
// 获取自定义错误信息
errmsg := getvalidmsg(err, form)
c.json(400, gin.h{"error": errmsg})
return
}
// 处理业务逻辑...
}组合验证规则:
type product struct {
// 多个验证规则用逗号分隔
name string `binding:"required,min=2,max=50" msg:"产品名称长度必须在2-50之间"`
price float64 `binding:"required,gte=0" msg:"价格必须大于或等于0"`
// 条件验证:当 status 为 "active" 时,description 必填
status string `binding:"required,oneof=active inactive" msg:"状态必须是 active 或 inactive"`
description string `binding:"required_if=status active" msg:"当状态为active时,描述必填"`
}跨字段验证:
type changepassword struct {
password string `binding:"required" msg:"密码不能为空"`
confirmpassword string `binding:"required,eqfield=password" msg:"两次输入的密码不一致"`
}初始化验证器:
func initvalidator() {
// 注册验证器
if v, ok := binding.validator.engine().(*validator.validate); ok {
// 注册自定义验证器
v.registervalidation("custom_validation", customvalidationfunc)
// 注册自定义错误信息翻译器
zhtranslations.registerdefaulttranslations(v, trans)
}
}这些标签主要用于:
- 数据验证(binding)
- 自定义错误信息(msg)
- 参数绑定
- 表单验证
- api 接口参数验证
通过合理使用这些标签,可以:
- 减少手动编写验证代码
- 提供更友好的错误提示
- 确保数据的完整性和有效性
- 提高代码的可维护性
到此这篇关于gorm 结构体中 binding 和 msg 结构体标签的文章就介绍到这了,更多相关gorm binding 和 msg 结构体标签内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论