gorm 结构体中 binding 和 msg 结构体标签示例详解

 更新时间:2024年11月12日 10:39:07   作者:get200  
文章介绍了Gin框架中binding和msg结构体标签的使用,包括基本用法、常用验证规则、自定义验证器、错误信息自定义、控制器使用示例、组合验证规则、跨字段验证和初始化验证器等,这些标签主要用于数据验证、自定义错误信息、参数绑定和表单验证

bindingmsg 是结构体标签(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 结构体标签内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Go语言递归函数的具体实现

    Go语言递归函数的具体实现

    本文主要介绍了Go语言递归函数的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言写入字符串到文件的方法

    Go语言写入字符串到文件的方法

    这篇文章主要介绍了Go语言写入字符串到文件的方法,实例分析了Go语言操作字符串及文本的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言编程入门超级指南

    Go语言编程入门超级指南

    这篇文章主要介绍了Go语言编程的入门指南,包括对Go的变量及函数的基本介绍,需要的朋友可以参考下
    2016-01-01
  • 基于Go语言实现Base62编码的三种方式以及对比分析

    基于Go语言实现Base62编码的三种方式以及对比分析

    Base62 编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,本文给大家介绍了Go语言实现Base62编码的三种方式以及对比分析,需要的朋友可以参考下
    2025-05-05
  • 深入理解Golang的单元测试和性能测试

    深入理解Golang的单元测试和性能测试

    Go语言提供了强大的测试工具,下面这篇文章主要给大家介绍了关于Golang单元测试和性能测试的相关资料,文中通过示例代码给大家详细介绍了单元测试和性能测试的相关内容,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Go语言中make和new函数的用法与区别

    Go语言中make和new函数的用法与区别

    这篇文章介绍了Go语言中make和new函数的用法与区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go语言中:= 运算符短变量声明的使用小结

    Go语言中:= 运算符短变量声明的使用小结

    本文全面解析Go语言特有的:=运算符,该运算符兼具变量声明和初始化功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 重学Go语言之如何使用Modules

    重学Go语言之如何使用Modules

    Go语言在Go.1.11版本发布了Go Modules,这是一种新的Go项目依赖管理解决方案,可以让Go项目的依赖包关系更加清晰,也更容易管理,下面就来看看Modules是如何使用的吧
    2023-07-07
  • Go Java算法之二叉树的所有路径示例详解

    Go Java算法之二叉树的所有路径示例详解

    这篇文章主要为大家介绍了Go Java算法之二叉树的所有路径示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 详解Go语言中的作用域和变量隐藏

    详解Go语言中的作用域和变量隐藏

    这篇文章主要为大家介绍了Go语言中的作用域和变量隐藏,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-04-04

最新评论