golang开源框架:go开源验证框架validator

validator 单个字段格式验证

先来一个单个字段格式的验证

目录结构
在这里插入图片描述

在main函数中

package mainimport "awesomeProject/validate"func main() {validate.SingleFieldValidate()
}

在validator.go中

package validateimport ("github.com/go-playground/validator/v10""log"
)var validate *validator.Validatefunc init() {validate = validator.New()validate.SetTagName("v")}func outRes(tag string, err *error) {log.Println("---------------------start" + tag + "----------------------")log.Println(*err)log.Println("---------------------end " + tag + "----------------------")err = nil
}

在single_field.go中

package validate//bool
//number
//string
//Slices//set//timefunc SingleFieldValidate() {v := validatevar err errorvar b boolerr = v.Var(b, "boolean")outRes("boolean", &err)var i = "100"err = v.Var(i, "number")outRes("number", &err)}

所得结果:
在这里插入图片描述
说明验证正确,返回了nil

而对于

	var i = "100"err = v.Var(i, "number")outRes("number", &err)var f = "100.12"err = v.Var(f, "numeric")outRes("numeric", &err)

对于数字类型的字符串,需要用numeric来校验(它可以校验小数点)
如果表示字符串,而是直接是数字,那么number和numeric就没有区别

通过

	var slice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9,}err = v.Var(slice, "max=15,min=2")outRes("slice", &err)

可以验证slice的长度,至于内容,看本文第三节

还有其他类型的格式验证

var timeStr = time.Now().Format("2006-01-02 15:04:05")err = v.Var(timeStr, "datetime=2006-01-02 15:04:05")outRes("time", &err)s1 := "abc"s2 := "abc"err = v.VarWithValue(s1, s2, "eqfield")outRes("eqfield", &err)i1 := 10i2 := 20err = v.VarWithValue(i1, i2, "ltfield")outRes("ltfield", &err)

validator 结构绑定格式验证

先创建struct.go文件来保存我们的结构体

package validatetype User struct {Name           stringAge            intPhone          stringEmail          stringFavoriteColor1 stringFavoriteColor2 stringAddress        *AddressContactUser    []*ContactUserHobby          []string
}type Address struct {Province stringCity     string
}type ContactUser struct {Name    stringAge     uint8Phone   stringEmail   stringAddress *Address
}

最开始我们在validate.go中设置了一个v

	validate.SetTagName("v")

使用v来设置验证要求

package validatetype User struct {Name           string         `v:"required,alphaunicode"`Age            int            `v:"gte=10,lte=30"`Phone          string         `v:"required,e164"`Email          string         `v:"required,email"`FavoriteColor1 string         `v:"iscolor"`FavoriteColor2 string         `v:"hexcolor|rgb|rgba|hsl|hsla"`Address        *Address       `v:"required"`ContactUser    []*ContactUser `v:"required,get=1,dive"`Hobby          []string       `v:"required,gte=2,dive,required,gte=2,alphaunicode"`
}type Address struct {Province string `v:"required"`City     string `v:"required"`
}type ContactUser struct {Name    string   `v:"required,alphaunicode"`Age     uint8    `v:"gte=20,lte=130"`Phone   string   `v:"required_without_all=Email Address,omitempty,e164"`Email   string   `v:"required_without_all=Phone Address,omitempty,email"`Address *Address `v:"required_without_all=Phone Email"`
}

补充测试代码

	err := v.Struct(user)if err != nil {if errors, ok := err.(validator.ValidationErrors); ok {for _, err := range errors {fmt.Println(err)

调用测试

package mainimport "awesomeProject/validate"func main() {validate.StructValidate()
}

在这里插入图片描述

没有如何显示,说明没有任何错误

注:通过dive表明要进一步验证切片內部验证有没有通过

切片与集合内元素格式验证

验证slice

package validatefunc SliceValidate(){v:=validateslice1:=[]string{"12345","6789","12345678"}var err errorerr = v.Var(slice1,"gte=3,dive,required,gte=5,lte=10,number")outRes("slice",&err)
}

gte=3表示切片数量大于等于3,
dive,切片内部元素检验
gte=5,lte=10,number ---- 是大于等于5小于等于10的数字

package mainimport "awesomeProject/validate"func main() {//validate.SingleFieldValidate()//validate.StructValidate()validate.SliceValidate()
}
验证

报错
在这里插入图片描述
说是索引为一的位置没有大于等于5
在这里插入图片描述
确实6789只有四个数字

测试二维切片

	slice2 := [][]string{{"12345", "12345", "69889", "12345678"},{"12345", "6789", "12345678"},{"12345", "12345", "69889", "12345678"},}err = v.Var(slice2, "gte=3,dive,required,gte=5,lte=10,number")outRes("slice", &err)

在这里插入图片描述
意思说,虽然 err = v.Var(slice2, "gte=3,dive,required,gte=5,lte=10,number")中第一个满足了第一维度有3个,但是第二维度大于5个则都不满足

将5改成3

	err = v.Var(slice2, "gte=3,dive,required,gte=3,lte=10,number")

在这里插入图片描述
报错不是number了,改成字符串
完成

再验证,slice里面放的是对象

type sliceStruct struct {OpCode int    `v:"eq=1|eq=2"`Op     string `v:"required"`
}slice3 := []*sliceStruct{{OpCode: 1,Op:     "切片操作",},{OpCode: 2,Op:     "切片操作",},{OpCode: 3,Op:     "切片操作",},}err = v.Var(slice3, "gte=2,dive")outRes("slice3", &err)

在这里插入图片描述
可以看到,第三个报错,OpCode只能是1或者2

验证无误

接下来我们看map

func MapValidates() {v := validatevar err errormp1 := map[string]string{"A": "12345","B": "6789","C": "12345678",}err = v.Var(mp1, "gte=3,dive,keys,len=1,alpha,endkeys,required,gte=4,lte=10,number")outRes("map", &err)}

当我们从map进入dive之后,就会发现有两个值key和value,可以先验证key再验证value

gte=3,dive, keys,len=1,alpha,endkeys,required,gte=4,lte=10,number

成功
在这里插入图片描述

我们再来试一试map的嵌套

mp2 := map[string]map[string]string{"A": {"A": "12345","B": "6789","C": "12345678",},"B": {"A": "12345","B": "6789","C": "12345678",},"C": {"A": "12345","B": "6789","C": "12345678",},}err = v.Var(mp2, "gte=3,dive,keys,len=1,alpha,endkeys,required,gte=3,dive,keys,len=1,alpha,endkeys,gte=2,lte=10,number")outRes("map2", &err)

此时value部分是我们的map
我们可以直接dive进入map
之后就和一层map是一样的

准确无误
在这里插入图片描述

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

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

相关文章

计算机网络-MSTP基础实验一(单域多实例)

前面我们已经大致了解了MSTP的基本概念和工作原理,但是我自己也觉得MSTP的理论很复杂不结合实验是很难搞懂的,今天来做一个配套的小实验以及一些配置命令。 一、网络拓扑 单域多实例拓扑 基本需求:SW1为VLAN10的网关,SW2为VLAN20的…

智谱AI清影升级:引领AI视频进入音效新时代

前几天智谱推出了新清影,该版本支持4k、60帧超高清画质、任意尺寸,并且自带音效的10秒视频,让ai生视频告别了"哑巴时代"。 智谱AI视频腾空出世,可灵遭遇强劲挑战!究竟谁是行业翘楚?(附测评案例)之前智谱出世那时体验了一…

商业物联网详细指南:优势与挑战

物联网是信息技术行业最具前景的领域之一。为什么它如此热门呢?原因在于全球连接性。设备可以像人群一样相互协作。正如我们所知,协作能显著提高生产力。 物联网对普通用户和企业都有益处。许多日常流程可以通过传感器、扫描仪、摄像头和其他设备实现自…

css uniapp背景图宽度固定高度自适应可以重复

page {height: 100%;background-image: url(https://onlinekc.a.hlidc.cn/uploads/20241115/350f94aaf493d05625a7ddbc86c7804e.png);background-repeat: repeat;background-size: contain;} 如果不要重复 把background-repeat: repeat;替换background-repeat: no-repeat;

学习日志012--python中多进程,多线程

简简单单小练习 1.线程的并发执行 import threading import time# 创建要执行的两个函数 def print_hello():for _ in range(10):print("hello")time.sleep(1)def print_world():for _ in range(10):print("world")time.sleep(1)# 创建线程对象 注意这里…

网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机

目录 网卡IP网络地址主机地址子网子网掩码网关默认网关 MACARPARP抓包分析 路由器NATNAPT 交换机 网卡 网卡(Network Interface Card,简称NIC),也称网络适配器。 OSI模型: 1、网卡工作在OSI模型的最后两层,物理层和数据链路层。物…

Ubuntu 22.04 上快速搭建 Samba 文件共享服务器

Samba 简介 Samba 是一个开源软件,它扮演着不同操作系统间沟通的桥梁。通过实现 SMB(Server Message Block)协议,Samba 让文件和打印服务在 Windows、Linux 和 macOS 之间自由流动。 以下是 Samba 的特点: 跨平台兼…

stm32启动过程解析startup启动文件

1.STM32的启动过程模式 1.1 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于…

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞,实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM,这种传感器的结构特别简单,成本特别低,单目相机的数据:照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

Java通过calcite实时读取kafka中的数据

引入maven依赖 <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-kafka</artifactId> <version>1.28.0</version> </dependency> 测试代码 import java.sql.Connection; import java.sql.DriverMan…

【时间之外】IT人求职和创业应知【36】-肖申克的救赎

目录 新闻一&#xff1a;信息技术应用创新产业大会在深圳开幕 新闻二&#xff1a;人工智能与大数据融合应用成为创业新热点 新闻三&#xff1a;云计算与边缘计算协同发展推动IT行业创新 认知和思考决定了你的赚钱能力。以下是今天可能引起你思考的热点新闻&#xff1a; 新闻…

python高级之简单爬虫实现

一、前言 场景1&#xff1a;一个网络爬虫&#xff0c;顺序爬取一个网页花了一个小时&#xff0c;采用并发下载就减少到了20分钟。 场景2&#xff1a;一个应用软件优化前每次打开网页需要3秒&#xff0c;采用异步并发提升到了200毫秒。 假设一个工程的工作量为100&#xff0c…

01_MinIO部署(Windows单节点部署/Docker化部署)

单节点-Windows环境安装部署 在Windows环境安装MinIO&#xff0c;主要包含两个东西&#xff1a; MinIO Server&#xff08;minio.exe&#xff09;&#xff1a;应用服务本身MinIO Client&#xff08;mc.exe&#xff09;&#xff1a;MinIO客户端工具&#xff08;mc&#xff09;…

数据分析24.11.13

Excel 函数 求和 函数 sum() sumif() SUMIF(range, criteria, [sum_range]) sumifs() average() count() max() min() 逻辑 函数 if() iferror() 查询函数 VLOOKUP()

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

java itext后端生成pdf导出

public CustomApiResult<String> exportPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {// 防止日志记录获取session异常request.getSession();// 设置编码格式response.setContentType("application/pdf;charsetUTF-8")…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-04

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-04 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-04目录1. Alopex: A Computational Framework for Enabling On-Device Function Calls with LLMs摘要&#xff1a;研究背景&…

NLP论文速读(谷歌出品)|缩放LLM推理的自动化过程验证器

论文速读|Rewarding Progress: Scaling Automated Process Verifiers for LLM Reasoning 论文信息&#xff1a; 简介&#xff1a; 这篇论文探讨了如何提升大型语言模型&#xff08;LLM&#xff09;在多步推理任务中的性能。具体来说&#xff0c;它试图解决的问题是现有的基于结…

k-近邻算法(K-Nearest Neighbors, KNN)详解:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…