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

使用Go Validator在Go应用中有效验证数据 Go Validator是一个开源的包,为Go结构体提供强大且易于使用的数据验证功能。该库允许开发者为其数据结构定义自定义验证规则,并确保传入的数据满足指定的条件。Go Validator支持内置验证器、自定义验证器,甚至允许您链式多个验证规则以满足更复杂的数据验证需求。如果内置验证器无法满足您的需求,您可以通过定义自己的验证函数来创建自定义验证器。这个功能允许您实现特定于应用程序需求的验证逻辑。 阅读详情

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是一样的

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

【Golang】validate 结构体验证 中文翻译器 validator 包简介 validator 是一个 Go 语言数据验证库,通过结构体标签定义验证规则,简化校验代码。支持内置验证规则和自定义验证函数。中文验证翻译器 阅读详情

相关推荐

go-validator

目前大都是使用validator 下面有些例子可能还会用到以下的包,请自行安装: https://github.com/go-playground/locales https://github.com/go-playground/universal-translator 1.安装 go get gopkg.in/go-playground/validator.v9 2. 原理 当然只能通过反射来实现了,之前写过一篇反射的文章golang之反射和断言,里面有写到怎么通过反射获取struct tag。 读取s

a...Z 1114

golang常用库:字段参数验证库-validator使用

一、背景# 在平常开发中,特别是在web应用开发中,为了验证输入字段的合法性,都会做一些验证操作。比如对用户提交的表单字段进行验证,或者对请求的API接口字段进行验证,验证字段的合法性,保证输入字段值的安全,防止用户的恶意请求。 一般的做法是用正则表达式,一个字段一个字段的进行验证。一个一个字段验证的话,写起来比较繁琐。那有没更好的方法,进行字段的合法性验证?有, 这就是下面要介绍的validator这个验证组件。 代码地址:https://github.com/go-playground/val..

hellozhxy的博客 5233

go validator使用教程

go validator使用教程 很多时候在B/S开发过程中,经常会遇到对参数的校验工作,一般客户端需要提前验证一次提交的数据是否合理,以减少后端的压力,而后端是必须要对数据做验证的。 一般验证的方式大多都是if-else,这种方式会让你掉入无底的深渊,就像下面一样。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeVUi8eX-1586155448562)(ht...

FlyWine的博客 2146

golang 组件 validator介绍以及使用案例——单字段验证和结构体验证

golang字段校验器框架validator 介绍和使用案例

qq_43058348的博客 3172

手把手教你玩转Infoseek舆情监测系统:从数据爬取到智能分析实战

别只会监测品牌名!一个有效的监测体系应该包括:// 完整的监测关键词策略brand: ["品牌名", "产品名", "缩写"],executives: ["CEO姓名", "高管姓名"],campaign: ["当前营销活动名称"],competitors: ["竞品A", "竞品B"],industry: ["行业通用关键词"],// 别忘了常见拼写错误和黑称defensive: ["常见的错误拼写", "用户起的黑称"]产品优化:从用户吐槽中发现改进点市场洞察。

2501_93332955的博客 758

图文带你理解什么是Few-shot Learning

Few-shot Learning(少样本学习)是Meta Learning(元学习)中的一个实例1,所以在了解什么是Few-shot Learning之前有必要对Meta Learning有一个简单的认识。不过在了解什么是Meta Learning之前还是要了解一下什么是Meta。因此,阅读本文后你将对如下知识有一个初步的了解。 What is Meta What is Meta Learning What is Few-shot Learning 1. What is Meta? meta就是描述

Pr4da的博客 1万+

golang工程组件之字段验证器validator

Validator提供了丰富的验证规则,能够满足大部分场景下的需求,并支持自定义验证规则。这时候,我们就需要自定义验证规则了。最后,我们定义了一个User结构体,并为它的Age字段设置了我们自定义的验证规则。在上面的例子中,数据验证失败了,我们使用for循环遍历所有的错误信息,并输出它们的字段名和相关规则(Tag)。在上面的例子中,我们定义了一个名为User的结构体,并为它的Name和Email字段设置了验证规则。接着,我们使用验证器对象的RegisterValidation方法注册我们定义的验证规则。

SMILY12138的博客 831

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 361

推荐开源项目:Golang ProtoBuf Validator Compiler——高效数据验证利器

在追求代码质量和效率的今天,我们经常遇到的一个挑战是如何有效地对结构化数据进行验证。特别是在基于Go语言开发的分布式系统中,ProtoBuf作为数据交换和序列化的首选方案,其高效性和简洁性不言而喻。然而, ProtoBuf本身在`proto3`中缺乏直接的字段级验证机制,这导致开发者不得不在业务逻辑中手动加入繁琐的验证代码。幸运的是,【Golang ProtoBuf Validator Compi...

gitblog_00380的博客 945

HWSD2.0土壤数据处理实战:从下载到属性提取全流程解析

本文详细解析了HWSD2.0全球土壤数据库从数据下载、属性筛选到GIS空间连接与提取的全流程实战方法。重点介绍了如何利用ArcGIS Pro等工具,将土壤单元编码与黏粒含量等属性表关联,最终生成全球土壤属性专题栅格图,为农业规划与生态研究提供关键数据支撑。

weixin_29214691的博客 610

Zynq7000混合启动方案:QSPI Flash引导与eMMC ext4文件系统部署实战

本文详细介绍了Zynq7000平台的混合启动方案,结合QSPI Flash引导与eMMC ext4文件系统部署,解决嵌入式Linux系统启动可靠性与大容量存储需求。通过硬件连接配置、分区规划、Petalinux工程配置及实战部署步骤,帮助开发者高效实现系统优化,提升启动速度和文件系统性能。

weixin_29190169的博客 447

推荐开源项目:Go Playground 的 Validator 工具

推荐开源项目:Go Playground 的 Validator 工具 【免费下载链接】validator :100:Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving ...

gitblog_00028的博客 542

【ComfyUI】FluxKontext 身形调优与体态增强

AI身形调优与体态增强解决方案 该工作流通过Flux系列模型实现人物体态的智能化增强,主要特点包括: 采用UNet主体模型+双文本编码器+身形增强LoRA的架构组合 通过ReferenceLatent保持原始姿态的同时强化胸腰臀比例 完整工作流包含图像加载、文本编码、潜空间映射等8个核心节点 支持自动化的前后效果对比展示 应用优势: 保持人物自然姿态的前提下实现局部强化 支持通过Prompt精确控制增强方向 适用于摄影后期、角色美化等创作场景 输出效果稳定且风格统一 使用方

Mr数据杨 1300

告别繁琐验证:Go Validator让结构体校验自动化

你是否还在为Go项目中的数据验证编写大量重复代码?检查字符串非空、数字范围、邮箱格式...这些琐碎工作占用开发时间却至关重要。本文将带你掌握Go Validator——一个轻量级结构体字段验证库,用标签注解替代上千行手动校验代码,让数据验证变得优雅高效。 读完本文你将学到: - 如何用3行代码实现复杂的多字段验证 - 10种内置验证规则的实战应用场景 - 从零构建自定义验证器解决业务特定规则 -...

gitblog_00693的博客 454

第3.2.1章 Eigen代码实战:四元数赋值用法总结及与变换矩阵转换

Eigen库中四元数(Quaternion)的赋值方法解析:Quaterniond和Quaternion<double>本质相同,但Quaterniond是更简洁的别名。主要赋值方式包括直接构造(w,x,y,z分量、旋转矩阵或轴角)、赋值运算符和成员函数赋值。使用时需注意参数顺序、归一化处理和头文件包含,常见错误包括模板参数缺失和构造顺序错误。四元数广泛应用于旋转矩阵转换、姿态组合等场景,合理选择赋值方式能提高代码可读性和正确性。

行知SLAM 587

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

golang validator验证包的使用

如果只是一两个输入信息的校验,直接使用if语句进行校验就完事了。由于开发过程中需要对多条信息进行校验,这种时候就需要专门的验证器工具validator进行处理。validator是一个开源的验证器包,可以快速校验输入信息是否符合自定规则。使用validator对页面传送过来的json数据进行校验。自定义tag在gin中使用。

qq_42931634的博客 785

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Go数据验证终极解决方案:如何用validator简化你的开发流程

还在为Go项目中繁琐的数据验证代码而烦恼吗?每次处理用户输入、API请求或配置文件时,你是否还在编写大量重复的if-else判断?今天我要介绍一个革命性的Go验证库——validator,它能让你用最优雅的方式解决所有数据验证难题。 **validator**是Go生态中最受欢迎的声明式验证库,它通过简单的结构体标签就能实现复杂的验证逻辑,被Gin、Echo等主流框架广泛采用。无论是基础字段验证

gitblog_07433的博客 383

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[Go实战]go-validator开源库 验证专用

go get"gopkg.in/go-playground/validator.v9" package main import ( "fmt" "reflect" "time" "gopkg.in/go-playground/validator.v9" ) type AddressDefault struct { Name string "user name" Pass...

学生董格 1016

Sliver 仓库中的 golang-jwt/jwt v4 迁移指南:从 jwt-go 到官方维护版本的平滑升级

本文以当前仓库(Adversary Emulation Framework,Sliver)中 vendored 的 [vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md](https://link.gitcode.com/i/3728cb40ecc48962853223d9da4d58a8) 为主体,全面解读 Go 社区 JWT 库 `go

gitblog_00990的博客 355
上一篇: Golang云原生项目:—实现ping操作
下一篇: golang开源框架:命令行框架cobra
fcopy
博客等级 码龄6年 252粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值