gin学习记录 - 3 | 青训营;

101 阅读2分钟

自定义错误信息

  • 当校验错误时,根据返回的错误信息自定义一个错误提示返回给前端页面,方便处理。

定义需要用到的结构体

type SignUserInfo struct {
	// 添加验证器 常用的
	Name string `json:"name" binding:"required" msg:"昵称不能为空"`    // 用户名
	Age  int    `json:"age" binding:"lt=100,gt=0" msg:"年龄不符合要求"` // 年龄
}   

封装成独立的函数

func GetValidMsg(err error, user SignUserInfo) string {
	// 将err接口断言为具体类型
	if errs, ok := err.(validator.ValidationErrors); ok {
		getObj := reflect.TypeOf(&user)
		fmt.Println("类型为:", getObj)

		// 断言成功
		for _, e := range errs { // 遍历每一个错误信息 报错信息可能有多个
			// 根据报错字段名,获取结构体的具体字段
			if f, exits := getObj.Elem().FieldByName(e.Field()); exits {
				msg := f.Tag.Get("msg")
				fmt.Println(msg)
				return msg
			} f f, exits := getObj.Elem().FieldByName(e.Field()); exits {
				msg := f.Tag.Get("msg")
				fmt.Println(msg)
				return msg
			}
		}
	}
	return "" // 没有检查到验证器错误则返回空
}

validator.ValidationErrors 是一个错误类型,用于存储验证器验证失败的错误信息 err.(validator.ValidationErrors) 表示 将 err 转换为 validator.ValidationErrors 类型。如果 errvalidator.ValidationErrors 类型或者它的指针类型,则类型断言会返回转换后的 validator.ValidationErrors类型的值和 true。如果 err 不是 validator.ValidationErrors类型或者它的指针类型,则类型断言会返回 validator.ValidationErrors类型的零值和 false

通过 getObj.Elem() 获取结构体的元素类型,因为 getObj 是结构体指针类型的反射对象, 使用 Elem() 方法可以获取指针指向的实际结构体类型。 然后,使用 FieldByName() 方法根据错误字段名 e.Field() 查找结构体中对应的字段。 如果字段存在, f 就是一个包含该字段信息的反射对象,并且 exitstrue 。如果字段不存在, f 将是零值的反射对象,并且 exitsfalse


main函数

func main() {
	router := gin.Default()

	router.POST("/check", func(c *gin.Context) {
		fmt.Println("访问...")
		var user SignUserInfo
		err := c.ShouldBindJSON(&user) // 返回error信息,不报错则返回空
		if err != nil {
			customErr := GetValidMsg(err, user) // 自定义的错误信息
			c.JSON(http.StatusBadRequest, gin.H{"msg": customErr})
			return
		}
		c.JSON(http.StatusOK, gin.H{"data": user})
	})

	err := router.Run(":80")
	if err != nil {
		return
	}
}

截图如下: 校验失败返回自定义的错误信息

写在最后

文章引自个人博客,担心被认为引流,这里就不放博客链接了~

学习这一节的时候看不懂,看源码也看不明白,这个时候最可靠的就是chatGPT了,全部代码复制粘贴发给他,然后让他一个函数一个函数解释,真是太棒了。