首页 后端开发 Golang 如何在 Go 中使用 Struct 标签自定义验证错误消息?

如何在 Go 中使用 Struct 标签自定义验证错误消息?

Dec 10, 2024 am 03:38 AM

How to Customize Validation Error Messages in Go Using Struct Tags?

使用结构体标签自定义验证错误消息

在使用 Gin 的 Go Web 开发中,结构体验证在持久化之前确保数据完整性方面起着至关重要的作用。然而,底层验证库提供的默认错误消息可能很冗长且不太用户友好。本文探讨了如何根据结构体标签返回自定义错误消息,让开发者能够向用户提供更有意义、更可操作的反馈。

理解 Validator.ValidationErrors

Gin 利用用于验证的 github.com/go-playground/validator/v10 库。当验证失败时,会返回 validator.ValidationErrors 类型的错误。此错误类型包含一个 validator.FieldError 实例片段,每个实例代表一个无效字段。

自定义错误消息

要自定义错误消息,您可以解开验证器。 ValidationErrors错误使用errors包,访问validator.FieldError,并根据字段的标签构造自定义错误消息。结构体字段中的 tag 属性允许开发人员指定自定义验证规则和错误消息。

例如,考虑以下代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

type ApiError struct {

    Field string

    Msg   string

}

 

func msgForTag(tag string) string {

    switch tag {

    case "required":

        return "This field is required"

    case "email":

        return "Invalid email"

    }

    return ""

}

登录后复制

此代码定义了一个 ApiError 结构体和一个辅助函数函数 msgForTag 将标签映射到自定义错误消息。使用它们,您可以实现以下处理程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

var u User

err := c.BindQuery(&u);

if err != nil {

    var ve validator.ValidationErrors

    if errors.As(err, &ve) {

        out := make([]ApiError, len(ve))

        for i, fe := range ve {

            out[i] = ApiError{fe.Field(), msgForTag(fe.Tag())}

        }

        c.JSON(http.StatusBadRequest, gin.H{"errors": out})

    }

    return

}

登录后复制

在此处理程序中,validator.ValidationErrors 错误被展开,并且每个 validator.FieldError 都会转换为带有基于字段标签的自定义消息的 ApiError 。然后对 ApiError 切片进行 JSON 编码,并作为错误响应返回,其中包含与字段对应的动态键。

结论

通过使用结构标记自定义验证错误消息,开发人员可以在数据验证期间提供更加用户友好且信息丰富的反馈。这种方法增强了用户体验并简化了调试过程,从而更容易识别和纠正输入错误。

以上是如何在 Go 中使用 Struct 标签自定义验证错误消息?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言包导入:带下划线和不带下划线的区别是什么? Go语言包导入:带下划线和不带下划线的区别是什么? Mar 03, 2025 pm 05:17 PM

Go语言包导入:带下划线和不带下划线的区别是什么?

Beego框架中NewFlash()函数如何实现页面间短暂信息传递? Beego框架中NewFlash()函数如何实现页面间短暂信息传递? Mar 03, 2025 pm 05:22 PM

Beego框架中NewFlash()函数如何实现页面间短暂信息传递?

如何编写模拟对象和存根以进行测试? 如何编写模拟对象和存根以进行测试? Mar 10, 2025 pm 05:38 PM

如何编写模拟对象和存根以进行测试?

如何使用跟踪工具了解GO应用程序的执行流? 如何使用跟踪工具了解GO应用程序的执行流? Mar 10, 2025 pm 05:36 PM

如何使用跟踪工具了解GO应用程序的执行流?

Go语言中如何将MySQL查询结果List转换为自定义结构体切片? Go语言中如何将MySQL查询结果List转换为自定义结构体切片? Mar 03, 2025 pm 05:18 PM

Go语言中如何将MySQL查询结果List转换为自定义结构体切片?

如何定义GO中仿制药的自定义类型约束? 如何定义GO中仿制药的自定义类型约束? Mar 10, 2025 pm 03:20 PM

如何定义GO中仿制药的自定义类型约束?

Go语言如何便捷地写入文件? Go语言如何便捷地写入文件? Mar 03, 2025 pm 05:15 PM

Go语言如何便捷地写入文件?

如何编写基准,以准确反映GO中的现实世界表现? 如何编写基准,以准确反映GO中的现实世界表现? Mar 10, 2025 pm 05:36 PM

如何编写基准,以准确反映GO中的现实世界表现?

See all articles