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 Plugin实现插件化编程的简单方法

    利用Go Plugin实现插件化编程的简单方法

    Golang官方提供了plugin模块,该模块可以支持插件开,下面这篇文章主要给大家介绍了关于如何利用Go Plugin实现插件化编程的相关资料,需要的朋友可以参考下
    2021-10-10
  • go语言简单的处理http请求的函数实例

    go语言简单的处理http请求的函数实例

    这篇文章主要介绍了go语言简单的处理http请求的函数,实例分析了Go语言处理http请求的技巧,需要的朋友可以参考下
    2015-03-03
  • Golang解析yaml文件的方法小结

    Golang解析yaml文件的方法小结

    Go 语言没有内置解析 yaml 文件的功能,实现 yaml 的解析可以使用第三方库,下面我们就来看看如何使用opkg.in/yaml.v2 和 gopkg.in/yaml.v3实现解析yaml吧
    2024-11-11
  • 使用Golang如何实现简易的令牌桶算法

    使用Golang如何实现简易的令牌桶算法

    这篇文章主要介绍了使用Golang如何实现简易的令牌桶算法问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Go语言基于viper实现apollo多实例快速

    Go语言基于viper实现apollo多实例快速

    viper是适用于go应用程序的配置解决方案,这款配置管理神器,支持多种类型、开箱即用、极易上手。本文主要介绍了如何基于viper实现apollo多实例快速接入,感兴趣的可以了解一下
    2023-01-01
  • go 字符串修改的操作代码

    go 字符串修改的操作代码

    这篇文章主要介绍了go 字符串修改,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Golang内存管理之内存分配器详解

    Golang内存管理之内存分配器详解

    Go内存分配器的设计思想来源于TCMalloc,全称是Thread-Caching Malloc,核心思想是把内存分为多级管理,下面就来和大家深入聊聊Go语言内存分配器的使用吧
    2023-06-06
  • go语言如何导入和使用包示例详解

    go语言如何导入和使用包示例详解

    这篇文章主要为大家介绍了go语言如何导入和使用包示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go中使用加密算法的方法

    Go中使用加密算法的方法

    本文通过实例代码给大家介绍go中使用加密算法的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • golang 生成二维码海报的实现代码

    golang 生成二维码海报的实现代码

    这篇文章主要介绍了golang 生成二维码海报的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论