Go语言中validation库不能校验零值问题的解决方法

 更新时间:2024年08月07日 09:47:29   作者:十三度灰  
在使用 Gin 框架的时候,前后端传递数据的时候,比如使用 JSON 格式,通常会使用 ShouldBindJSON 去用结构体打 tag 绑定前端传来的 JSON 格式数据,本文给大家介绍了Go语言中validation库不能校验零值问题的解决方法,需要的朋友可以参考下

问题描述

在用于绑定的结构体中,通常会使用 validator 库进行参数的校验,比如:

 type User struct {
     Name   string `json:"name" binding:"required" example:"kkk"`
     Age    int    `json:"age" binding:"required" example:"18"`
     Status int    `json:"status" binding:"required" example:"1"`
 }

我们规定前端传递的参数中,user、age、status 参数都为必填

然后在 Handler 函数中使用 ShouldBindJSON 绑定参数,如下:

 func handlerT(c *gin.Context) {
     var user User
     if err := c.ShouldBindJSON(&user); err != nil {
         fmt.Println(err)
         c.JSON(400, gin.H{"msg": "参数错误" + err.Error()})
         return
     }
 }

完整代码如下:

 package main
 ​
 import (
     "fmt"
     "github.com/gin-gonic/gin"
 )
 ​
 type User struct {
     Name   string `json:"name" binding:"required" example:"kkk"`
     Age    int    `json:"age" binding:"required" example:"18"`
     Status int    `json:"status" binding:"required" example:"1"`
 }
 ​
 func handlerT(c *gin.Context) {
     var user User
     if err := c.ShouldBindJSON(&user); err != nil {
         fmt.Println(err)
         c.JSON(400, gin.H{"msg": "参数错误" + err.Error()})
         return
     }
     c.JSON(200, gin.H{"msg": "ok", "data": user})
 }
 ​
 func main() {
     r := gin.Default()
     r.POST("/user", handlerT)
 ​
     // 监听
     err := r.Run(":9090")
     if err != nil {
         panic(err.Error())
     }
 }

使用 Postman 去调试接口:

可以看到没有问题,但是当 status 值为 0 的时候,参数校验就会不通过:

解决方法

原因是:Go 中会给结构体中没有赋值的字段赋予零值(int 类型默认 0、string 类型默认 "",等等),标签写成 require 时,如果传递零值,validator 校验的时候就会认为没有传递这个字段,进而报错

解决方法也很简单,既然原因是因为字段的类型零值是 0,那选用默认值不是 0 的数据类型,而且也要是数值类型

所以,解决方法就是:把 int 类型改为 *int 类型,使用 int 的指针类型,零值为 nil,这样传递的时候就能成功绑定

结构体改为:

type User struct {
     Name   string `json:"name" binding:"required" example:"kkk"`
     Age    int    `json:"age" binding:"required" example:"18"`
     Status *int   `json:"status" binding:"required" example:"1"`
 }

再使用 Postman 调试:

可以看到成功绑定,但是这样会有一个问题:

在绑定成功后,我们可能需要针对 user.Status 字段写一些逻辑,比如 status 值为 1 时表示为正常状态,0 为非正常状态,那么简单的示例为:

可以看到,user.Status == 0 这一段报错了,因为 user.Status 是指针类型,不能直接与 int 类型比较,要想比较只能加上地址符 * ,或者再使用一个变量接收由 *int 类型转换来的 int 类型

总结

当遇到 validator 库无法校验零值时,把数据类型换为对应的指针类型即可正常接收,但是在后续逻辑中,不能直接用这个指针类型的值进行常规运算,要么加上地址符 * 要么用中间变量接收转换后的值

以上就是Go语言中validation库不能校验零值问题的解决方法的详细内容,更多关于Go validation不能校验零值的资料请关注脚本之家其它相关文章!

相关文章

  • golang接口实现调用修改(值接收者指针接收者)场景详解

    golang接口实现调用修改(值接收者指针接收者)场景详解

    这篇文章主要为大家介绍了golang接口实现调用修改值接收者指针接收者示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • GoFrame框架使用避坑指南和实践干货

    GoFrame框架使用避坑指南和实践干货

    这篇文章主要为大家介绍了GoFrame框架使用避坑指南和实践干货,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go如何优雅的关闭goroutine协程

    Go如何优雅的关闭goroutine协程

    本文将介绍首先为什么需要主动关闭goroutine,并介绍如何在Go语言中关闭goroutine的常见套路,包括传递终止信号和协程内部捕捉终止信号,之后,文章列举了需要主动关闭协程运行的常见场景,希望通过本文的介绍,读者能够掌握如何在适当的时候关闭goroutine
    2023-05-05
  • Go语言中Seeker接口的用法详解

    Go语言中Seeker接口的用法详解

    Go语言标准库中的io包提供了一系列接口,用于处理各种I/O操作,其中Seeker接口在处理大文件或需要随机访问的场景中非常有用,本文将结合具体案例,详细介绍Go语言中io包的Seeker接口的用法,需要的朋友可以参考下
    2024-10-10
  • golang的os包用法详解

    golang的os包用法详解

    Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,本文将详细介绍了golang的os包用法,需要的朋友可以参考下
    2023-05-05
  • Golang channel为什么不会阻塞的原因详解

    Golang channel为什么不会阻塞的原因详解

    这篇文章主要为大家介绍了Golang channel为什么不会阻塞的原因详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 图文详解Go中的channel

    图文详解Go中的channel

    Channel是go语言内置的一个非常重要的特性,也是go并发编程的两大基石之一,下面这篇文章主要给大家介绍了关于Go中channel的相关资料,需要的朋友可以参考下
    2023-02-02
  • 一文掌握gorm简介及如何使用gorm

    一文掌握gorm简介及如何使用gorm

    Gorm是一款用于Golang的ORM框架,它提供了丰富的功能,包括模型定义、数据验证、关联查询等,下面通过本文掌握gorm简介及使用方法,需要的朋友可以参考下
    2024-02-02
  • Go语言并发处理的使用详解

    Go语言并发处理的使用详解

    Go语言通过内置的goroutine和channel机制,实现了高效的并发编程,本文就来介绍一下Go语言并发处理的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • golang flag介绍和使用示例

    golang flag介绍和使用示例

    本文主要介绍了Go语言中flag包的使用方法,详细阐述了基本概念及常用函数,并通过示例代码进行了具体演示,总结中指出,flag包提供了一种方便的方式来处理命令行参数,可定义不同类型的标志,并在解析后使用这些参数
    2024-10-10

最新评论