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

news2024/11/19 22:55:38

validator 单个字段格式验证

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

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

在main函数中

package main

import "awesomeProject/validate"

func main() {
	validate.SingleFieldValidate()
}

在validator.go中

package validate

import (
	"github.com/go-playground/validator/v10"
	"log"
)

var validate *validator.Validate

func 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

//time

func SingleFieldValidate() {
	v := validate
	var err error
	var b bool
	err = 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 := 10
	i2 := 20
	err = v.VarWithValue(i1, i2, "ltfield")
	outRes("ltfield", &err)

validator 结构绑定格式验证

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

package validate

type User struct {
	Name           string
	Age            int
	Phone          string
	Email          string
	FavoriteColor1 string
	FavoriteColor2 string
	Address        *Address
	ContactUser    []*ContactUser
	Hobby          []string
}

type Address struct {
	Province string
	City     string
}

type ContactUser struct {
	Name    string
	Age     uint8
	Phone   string
	Email   string
	Address *Address
}

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

	validate.SetTagName("v")

使用v来设置验证要求

package validate

type 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 main

import "awesomeProject/validate"

func main() {
	validate.StructValidate()
}

在这里插入图片描述

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

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

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

验证slice

package validate

func SliceValidate(){
	v:=validate
	
	slice1:=[]string{"12345","6789","12345678"}
	var err error
	
	err = 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 main

import "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 := validate
	var err error
	mp1 := 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.coloradmin.cn/o/2243671.html

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

相关文章

【Rust中的项目管理】

Rust中的项目管理 前言Package,Crate,Module &use ,Path通过代码示例解释 Crate,Module ,use,Path创建一个package:代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…

大型语言模型综述 A Survey of Large Language Models

文章源自 2303.18223 (arxiv.org) 如有侵权,请通知下线 这是一篇关于大语言模型(LLMs)的综述论文,主要介绍了 LLMs 的发展历程、技术架构、训练方法、应用领域以及面临的挑战等方面,具体内容如下: 摘要…

模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC

文章目录 预测框的预测指标——IoU(交并比)分类预测指标混淆矩阵(Confusion Matrix,TP、FP、FN、TN)Precision(精度)Recall(召回率)P-R曲线F1-scoreTPR、TNR、FPR、FNRROC曲线下面积…

【Android原生问题分析】夸克、抖音划动无响应问题【Android14】

1 问题描述 偶现问题,用户打开夸克、抖音后,在界面上划动无响应,但是没有ANR。回到Launcher后再次打开夸克/抖音,发现App的界面发生了变化,但是仍然是划不动的。 2 log初分析 复现问题附近的log为: 用户…

datawhale 2411组队学习:模型压缩4 模型量化理论(数据类型、int8量化方法、PTQ和QWT)

文章目录 一、数据类型1.1 整型1.2 定点数1.3 浮点数1.3.1 正规浮点数(fp32)1.3.2 非正规浮点数(fp32)1.3.3 其它数据类型1.3.4 浮点数误差1.3.5 浮点数导致的模型训练问题 二、量化基本方法2.1 int8量化2.1.1 k-means 量化2.1.2 …

ssm139选课排课系统的设计与开发+vue(论文+源码)_kaic

摘 要 互联网的普及,改变了人们正常的生活学习及消费习惯,而且也大大的节省了人们的时间,由于各种管理系统都再不断的增加,更方便了用户,也改良了很多的用户习惯。对于选课排课系统查询方面缺乏系统的管理方式&#x…

Datawhale组队学习】模型减肥秘籍:模型压缩技术3——模型量化

模型量化的目的是通过将浮点运算转换为定点运算,以减少模型大小、内存和存储需求,同时加快推理速度,降低计算功耗,使得模型在低算力设备上运行更加高效,特别适用于嵌入式设备或移动端场景。 不同数据类型(…

【MongoDB】MongoDB的集群,部署架构,OptLog,集群优化等详解

文章目录 一、引入复制集的原因二、复制集成员(一)基本成员(二)主节点(Primary)细化成员 三、复制集常见部署架构(一)基础三节点(二)跨数据中心 四、复制集保…

Javaweb梳理17——HTMLCSS简介

Javaweb梳理17——HTML&CSS简介 17 HTML&CSS简介17.1 HTML介绍17.2 快速入门17.3 基础标签17.3 .1 标题标签17.3.2 hr标签17.3.3 字体标签17.3.4 换行17.3.8 案例17.3.9 图片、音频、视频标签17.3.10 超链接标签17.3.11 列表标签17.3.12 表格标签17.3.11 布局标签17.3.…

远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接

前言:大家好!今天我要教你们如何在树莓派5上安装Raspberry Pi OS,并配置SSH和VNC权限。通过这些步骤,你将能够在Windows电脑上使用VNC Viewer,结合Cpolar内网穿透工具,实现长期的公网远程访问管理本地树莓派…

力扣 LeetCode 94. 二叉树的中序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;左中右&#xff09; class Solution {List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode root…

MySQL查询执行(七):临时表

临时表重名 思考&#xff1a;临时表和内存表的区别? 内存表&#xff0c; 指的是使用Memory引擎的表&#xff0c; 建表语法是create table …enginememory。 这种表的数据都保存在内存里&#xff0c; 系统重启的时候会被清空&#xff0c; 但是表结构还在。 除了这两个特性看上…

自己动手写Qt Creator插件

文章目录 前言一、环境准备1.先看自己的Qt Creator IDE的版本2.下载源码 二、使用步骤1.参考原本的插件2.编写自定义插件1.cmakelist增加一个模块2.同理&#xff0c;qbs文件也增加一个3.插件源码 三、效果总结 前言 就目前而言&#xff0c;Qt Creator这个IDE&#xff0c;插件比…

【星海随笔】ZooKeeper-Mesos

开源的由 Twitter 与 伯克利分校的 Mesos 项目组共同研发设计。 两极调度架构 支持高可用集群&#xff0c;通过ZooKeeper进行选举。 Mesos master 管理着所有的 Mesos slave 守护进程 每个slave运行具体的任务或者服务。 Franework 包括的调度器和执行机两部分 执行器运行在Me…

集群聊天服务器(12)nginx负载均衡器

目录 负载均衡器nginx负载均衡器优势 如何解决集群聊天服务器跨服务器通信问题&#xff1f;nginx的TCP负载均衡配置nginx配置 负载均衡器 目前最多只能支持2w台客户机进行同时聊天 所以要引入集群&#xff0c;多服务器。 但是客户连哪一台服务器呢&#xff1f;客户并不知道哪一…

集群聊天服务器(3)muduo网络库

目录 基于muduo的客户端服务器编程 muduo只能装在linux中&#xff0c;依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池&#xff0c;muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定&#xff0c;基本就只有chatserver的类名…

深入内核讲明白Android Binder【一】

深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…

探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力

概述 心理健康是公共卫生最重要的领域之一。根据美国国家精神卫生研究所&#xff08;NIMH&#xff09;的数据&#xff0c;到 2021 年&#xff0c;22.8% 的美国成年人将患上某种形式的精神疾病。在全球范围内&#xff0c;精神疾病占非致命性疾病负担的 30%&#xff0c;并被世界…

排序(C语言实现)

排序 文章目录 排序插入排序直接插入排序折半查找插入排序希尔排序 选择排序简单选择排序堆排序一、构建堆**堆有以下性质**&#xff1a;**堆的存储方式**&#xff1a;**设计堆**数据结构堆的维护堆的初始化创建堆插入一个元素删除一个元素返回有效元素的个数获得优先级最高的元…