Go的gin参数校验之validator库

使用 validator 以后,只需要在定义结构体时使用bindingvalidatetag标识相关校验规则,就可以进行参数校验了,而不用自己单独去写常见的校验规则。

main.go

package mainimport ("fmt""github.com/go-playground/validator/v10""github.com/go-playground/locales/zh_Hans_CN"unTrans "github.com/go-playground/universal-translator"zhTrans "github.com/go-playground/validator/v10/translations/zh"
)type User struct {Username string `validate:"min=6,max=10,contains=ook,startswith=He"`Age      uint8  `validate:"gte=1,lte=10"`Sex      string `validate:"oneof=female male"`Email    string `validate:"email"`
}func main() {validate := validator.New()//user := User{Username: "Heooking", Age: 6, Sex: "male", Email: "test@qq.com"}user := User{Username: "Looking", Age: 26, Sex: "male", Email: "qq.com"}err := validate.Struct(user)// 默认英文提示if err != nil {fmt.Println(err)//Key: 'User.Username' Error:Field validation for 'Username' failed on the 'startswith' tag//Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag//Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag}fmt.Println()// 中文错误提示uni := unTrans.New(zh_Hans_CN.New())trans, _ := uni.GetTranslator("zh_Hans_CN")zhTrans.RegisterDefaultTranslations(validate, trans)if err != nil {for _, v := range err.(validator.ValidationErrors) {fmt.Println(v.Translate(trans))//Username必须以文本'He'开头//Age必须小于或等于10//Email必须是一个有效的邮箱}}
}

go.mod

module testgo 1.17require (github.com/go-playground/validator/v10 v10.15.0
)require (github.com/gabriel-vasile/mimetype v1.4.2 // indirectgithub.com/go-playground/locales v0.14.1 // indirectgithub.com/go-playground/universal-translator v0.18.1 // indirectgithub.com/leodido/go-urn v1.2.4 // indirectgolang.org/x/crypto v0.7.0 // indirectgolang.org/x/net v0.8.0 // indirectgolang.org/x/sys v0.6.0 // indirect
)

常用约束如下:

字符串约束

  • excludesall:不包含参数中任意的 UNICODE 字符,例如excludesall=ab;
  • excludesrune:不包含参数表示的 rune 字符,excludesrune=asong;
  • startswith:以参数子串为前缀,例如startswith=hi;
  • endswith:以参数子串为后缀,例如endswith=bye。
  • contains=:包含参数子串,例如contains=email;
  • containsany:包含参数中任意的 UNICODE 字符,例如containsany=ab;
  • containsrune:包含参数表示的 rune 字符,例如`containsrune=asong;
  • excludes:不包含参数子串,例如excludes=email;

范围约束
范围约束的字段类型分为三种:

  • 对于数值,我们则可以约束其值
  • 对于切片、数组和map,我们则可以约束其长度
  • 对于字符串,我们则可以约束其长度

常用 tag 介绍:

  • ne:不等于参数值,例如 ne=5;
  • gt:大于参数值,例如 gt=5;
  • gte:大于等于参数值,例如 gte=50;
  • lt:小于参数值,例如 lt=50;
  • lte:小于等于参数值,例如 lte=50;
  • oneof:只能是列举出的值其中一个,这些值必须是数值或字符串,以空格分隔,如果字符串中有空格,将字符串用单引号包围,例如 oneof=male female。
  • eq:等于参数值,注意与 len不同。对于字符串, eq约束字符串本身的值,而 len约束字符串长度。例如 eq=10;
  • len:等于参数值,例如 len=10;
  • max:小于等于参数值,例如 max=10;
  • min:大于等于参数值,例如 min=10
  • Fields约束
  • eqfield:定义字段间的相等约束,用于约束同一结构体中的字段。例如: eqfield=Password
  • eqcsfield:约束统一结构体中字段等于另一个字段(相对),确认密码时可以使用,例如: eqfiel=ConfirmPassword
  • nefield:用来约束两个字段是否相同,确认两种颜色是否一致时可以使用,例如: nefield=Color1
  • necsfield:约束两个字段是否相同(相对)

常用约束

  • unique:指定唯一性约束,不同类型处理不同:

        对于map,unique约束没有重复的值
        对于数组和切片,unique没有重复的值
        对于元素类型为结构体的碎片,unique约束结构体对象的某个字段不重复,使用 unique=field指定字段名

  • email:使用email来限制字段必须是邮件形式,直接写eamil即可,无需加任何指定。
  • omitempty:字段未设置,则忽略
  • -:跳过该字段,不检验;
  • |:使用多个约束,只需要满足其中一个,例如rgb|rgba;
  • required:字段必须设置,不能为默认值;
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学生创业出路【第二弹】科创训练营

目录 🚀一、我从哪里了解到的训练营 🚀二、训练营里学习和日常 🔎学习 🔎环境和设备 🔎遇到的人 🔎团队记录视频 🚀三、感悟 ​​​​个人主页:一天三顿-不喝奶茶&#x1f39…

Room封装APP离线缓存框架HiStorage——jetpack技术

在移动应用开发中,离线缓存是提高用户体验和应用性能的关键策略之一。为了简化开发者的工作,Jetpack技术组件提供了一系列强大的工具,其中Room是一个功能强大的数据库持久化库。 HiStorage,它提供了简单易用的接口,帮助…

JVM元空间溢出的排除思路

背景: java的应用我们为了防止元空间的无限扩展,一般都会设置MaxMetaSpace参数,一般来说只要这个值是512M或者1G左右就足够了,不过今天遇到一个meta空间溢出问题,简单记录下排除的思路 meta元空间溢出 最开始的现象…

实验六 u-boot-2013.01移植

【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 一、建立自己的平台 下载uboot源码 在uboo…

2023年Java核心技术面试第三篇(篇篇万字精讲)

目录 六. Java反射机制以及动态代理是基于什么原理 6.1 反射机制: 6.2 反射例子: 6.3 动态代理: 6.4 例子: 6.5 总结: 6.5.1 代理模式 6.5.1.1动态代理: *6.5.1.2 JDK动态代理: *6.5.1.3 cglib…

【网络】DNS | ICMP | NAT | 代理服务器

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程&#xff…

56 | 国内游戏直播竞品分析

国内游戏直播竞品分析 一、需求分析 当前直播用户群可分为两大类: 主播观众用户需求: 1.主播: 作为直播内容的创造者,主播表现方式和内容很大程度上决定了观众的需求, 其中主播主要只有三点需求: (一) 通过某一手段(如游戏技术、唱歌技巧)获取他人关注,满足虚荣心…

rest_framework(4)序列化和反序列化(二)

本系列文章中的上一篇文章:序列化和反序列化(一) urls.py 代码 from django.urls import re_path from sers.views import BookDetailView urlpatterns [re_path(r"sers/book/(\d)", BookDetailView.as_view()), } models.py 代…

【⑬MySQL | 数据类型(一)】简介 | 整数 | 浮点 | 定点类型

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据类型简介 | 整数 | 浮点 | 定点类型的分享✨ 目录 前言0.数据类型简介1 整数类型2 浮点类型3 定点类型4 日期/时间类型总结 0.数据类型简介 数据类型(data_type)是指系统中所允许的…

LRU淘汰策略执行过程

1 介绍 Redis无论是惰性删除还是定期删除,都可能存在删除不尽的情况,无法删除完全,比如每次删除完过期的 key 还是超过 25%,且这些 key 再也不会被客户端访问。 这样的话,定期删除和堕性删除可能都彻底的清理掉。如果…

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

docker保存容器镜像并在新机器加载

保存镜像,主要用到 docker save命令 从镜像包加载镜像,主要用到 docker load命令 目录 方法1 多个镜像,且带额外操作,如压缩的情况 方法2 方法1 docker save 0fk8ab59a85f > im.tar 或 docker save 镜像名称:tag > im…

AWS SDK 3.x for .NET Framework 4.0 可行性测试

前言 为了应对日益增长的网络安全挑战, 越来越多的互联网厂商已经陆续开始或者已经彻底停止了对 SSL 3 / TLS 1.0 / TLS1.1 等上古加密算法的支持. 而对于一些同样拥有悠久历史的和 AWS 服务相关联的应用程序, 是否可以通过仅更新 SDK 版本的方式来适应新的环境. 本文将以 Win…

揭开pkill的秘密:在Linux中杀死进程的完整指南

揭开pkill的秘密:在Linux中杀死进程的完整指南 一、前言二、进程管理基础知识2.1、什么是进程?2.2、进程管理的原理和目的2.3、进程状态和标识符 三、理解Linux pkill命令3.1、pkill命令的概述和作用3.2、与kill命令的对比3.3、常见的pkill命令选项和参数…

Linux 编译内核模块出现--Unknown symbol mcount

文章目录 Linux suse: # cat /etc/os-release NAME"SLES" VERSION"12-SP2" VERSION_ID"12.2" PRETTY_NAME"SUSE Linux Enterprise Server 12 SP2" ID"sles" ANSI_COLOR"0;32" CPE_NAME"cpe:/o:s…

PCAP01介绍和STM32模拟SPI驱动

一.芯片介绍 Pcap01是德国acam公司设计的一款革命性的电容测量芯片。该芯片 内部有DSP计算单元,可以直接将电容元件接到Pcap01芯片,然后芯片计算出容值大小,通过SPI总线将电容容值数据传送给CPU,电容测量完全数字化。 二,测量原…

LeetCode 面试题 01.05. 一次编辑

文章目录 一、题目二、C# 题解法一:从第一个不同位置处判断后续相同子串法二:前后序遍历判断第一个不同字符的位置关系 优化法一法二 一、题目 字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串&#xff…

无脑入门pytorch系列(五)—— nn.Dropout

本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思…

docker启用cgroup v2

要求 本人的操作系统是kali,基于debian docker info如果你这里是2那么说明启用了,如果是1,那么就未启用 对于Docker来说,Cgroups v2的使用需要满足以下条件: Linux内核版本在4.15以上。 uname -r 系统已经启用Cgro…

前端处理图片文件的方法

在项目开发过程中&#xff0c;有一个需求&#xff0c;需要前端对上传的图片进行处理&#xff0c;以字符串的形式传给后端&#xff0c;实现效果如下&#xff1a; 1.上传图片的组件 在该项目中&#xff0c;使用了element plus组件库 <el-uploadv-model:file-list"fileL…