首页 > 其他分享 >golang之数据验证validator

golang之数据验证validator

时间:2023-06-16 10:22:26浏览次数:45  
标签:struct 验证 len golang Field validator validate Other

https://blog.csdn.net/guyan0319/article/details/105918559/

前言
在web应用中经常会遇到数据验证问题,普通的验证方法比较繁琐,这里介绍一个使用比较多的包validator。

原理
将验证规则写在struct对字段tag里,再通过反射(reflect)获取struct的tag,实现数据验证。

安装

go get github.com/go-playground/validator/v10

示例

package main

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

type Users struct {
    Phone   string `form:"phone" json:"phone" validate:"required"`
    Passwd   string `form:"passwd" json:"passwd" validate:"required,max=20,min=6"`
    Code   string `form:"code" json:"code" validate:"required,len=6"`
}

func main() {

    users := &Users{
        Phone:      "1326654487",
        Passwd:       "123",
        Code:            "123456",
    }
    validate := validator.New()
    err := validate.Struct(users)
    if err != nil {
        for _, err := range err.(validator.ValidationErrors) {
            fmt.Println(err)//Key: 'Users.Passwd' Error:Field validation for 'Passwd' failed on the 'min' tag
            return
        }
    }
    return
}

验证规则
required :必填
email:验证字符串是email格式;例:“email”
url:这将验证字符串值包含有效的网址;例:“url”
max:字符串最大长度;例:“max=20”
min:字符串最小长度;例:“min=6”
excludesall:不能包含特殊字符;例:“excludesall=0x2C”//注意这里用十六进制表示。
len:字符长度必须等于n,或者数组、切片、map的len值为n,即包含的项目数;例:“len=6”
eq:数字等于n,或者或者数组、切片、map的len值为n,即包含的项目数;例:“eq=6”
ne:数字不等于n,或者或者数组、切片、map的len值不等于为n,即包含的项目数不为n,其和eq相反;例:“ne=6”
gt:数字大于n,或者或者数组、切片、map的len值大于n,即包含的项目数大于n;例:“gt=6”
gte:数字大于或等于n,或者或者数组、切片、map的len值大于或等于n,即包含的项目数大于或等于n;例:“gte=6”
lt:数字小于n,或者或者数组、切片、map的len值小于n,即包含的项目数小于n;例:“lt=6”
lte:数字小于或等于n,或者或者数组、切片、map的len值小于或等于n,即包含的项目数小于或等于n;例:“lte=6”
跨字段验证
如想实现比较输入密码和确认密码是否一致等类似场景

eqfield=Field: 必须等于 Field 的值;
nefield=Field: 必须不等于 Field 的值;
gtfield=Field: 必须大于 Field 的值;
gtefield=Field: 必须大于等于 Field 的值;
ltfield=Field: 必须小于 Field 的值;
ltefield=Field: 必须小于等于 Field 的值;
eqcsfield=Other.Field: 必须等于 struct Other 中 Field 的值;
necsfield=Other.Field: 必须不等于 struct Other 中 Field 的值;
gtcsfield=Other.Field: 必须大于 struct Other 中 Field 的值;
gtecsfield=Other.Field: 必须大于等于 struct Other 中 Field 的值;
ltcsfield=Other.Field: 必须小于 struct Other 中 Field 的值;
ltecsfield=Other.Field: 必须小于等于 struct Other 中 Field 的值;
示例

type UserReg struct {
    Passwd   string `form:"passwd" json:"passwd" validate:"required,max=20,min=6"`
    Repasswd   string `form:"repasswd" json:"repasswd" validate:"required,max=20,min=6,eqfield=Passwd"`
}

自定义验证类型

示例:

package main

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

type Users struct {
	Name   string `form:"name" json:"name" validate:"required,CustomValidationErrors"`//包含自定义函数
	Age   uint8 `form:"age" json:"age" validate:"required,gt=18"`
	Passwd   string `form:"passwd" json:"passwd" validate:"required,max=20,min=6"`
	Code   string `form:"code" json:"code" validate:"required,len=6"`
}

func main() {

	users := &Users{
		Name:      "admin",
		Age:        12,
		Passwd:       "123",
		Code:            "123456",
	}
	validate := validator.New()
	//注册自定义函数
	_=validate.RegisterValidation("CustomValidationErrors", CustomValidationErrors)
	err := validate.Struct(users)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			fmt.Println(err)//Key: 'Users.Name' Error:Field validation for 'Name' failed on the 'CustomValidationErrors' tag
			return
		}
	}
	return
}

func CustomValidationErrors(fl validator.FieldLevel) bool {
return fl.Field().String() != "admin"
}

  

标签:struct,验证,len,golang,Field,validator,validate,Other
From: https://www.cnblogs.com/minch/p/17484918.html

相关文章

  • golang之context
    context用来解决goroutine之间退出通知、元数据传递的功能。 context使用起来非常方便。源码里对外提供了一个创建根节点context的函数:funcBackground()Context background是一个空的context,它不能被取消,没有值,也没有超时时间。有了根节点context,又提供了......
  • 验证toml文件合法性
    装golang,假设在linux环境下 获取源码 gogetgithub.com/BurntSushi/toml 进到目录github.com/BurntSushi/tomlcmd/tomlv下,进行编译 gobuild. 然后把tomlv放到/bin目录下。 验证toml配置文件合法性,用法如下: tomlvsome-toml-file.toml......
  • Golang的wire是什么
    Golang的wire是什么了解Golang的wire框架对于构建可维护和可扩展的应用程序至关重要在当今的技术世界中,谷歌的Go语言(Golang)已经成为了许多开发人员的首选语言。Go语言以其简洁性、高效性和并发性而闻名,因此在开发各种类型的应用程序时广受欢迎。随着Go语言的不断发展,出现了许多框......
  • golang之http请求库go-resty
     github: https://github.com/go-resty/resty go-resty特性#go-resty 有很多特性:发起GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,etc.请求简单的链式书写自动解析JSON和XML类型的文档上传文件重试功能客户端测试功能RestyclientCustom RootCertif......
  • golang之errors包
    errors包常用方法funcUnwrap(errerror)error//获得err包含下一层错误funcIs(err,targeterror)bool//判断err是否包含targetfuncAs(errerror,targetinterface{})bool//判断err是否为target类型   自定义错误信息err......
  • 最新SMS-Activate短信验证码接收教程
    有些国外应用在使用应用上的功能时需要注册账号,由于某种不可抗因素,我们的手机号一般不支持注册,接收不到信息验证码,于是我们可以使用sms-activate提供的服务,实惠又稳定,最近sms-activate.org网站迎来了大更新许多小伙伴私信我说不会使用SmS-Activate了,今天正巧有需求,索性将验证过程......
  • HTTPS单向验证和双向验证
    参考下文HTTPS实战之单向验证和双向验证一文看懂HTTPS、证书机构(CA)、证书、数字签名、私钥、公钥......
  • C#.NET CORE .NET6 RSA 私钥签名 公钥验签(验证签名) ver:20230614
    C#.NETCORE.NET6RSA私钥签名公钥验签(验证签名)ver:20230614 环境说明:.NETCORE版本:.NET6。 .NETCORE对于RSA的支持:1..NET6中内置了对PKCS1,PKCS82种私钥格式的支持。2.私钥字符串要去除"-----BEGINRSAPRIVATEKEY-----"、"-----ENDRSAPRIVATEKEY---......
  • JS逆向实战18——猿人学第八题 验证码 - 图文点选
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!网站https://match.yuanrenxue.cn/match/8网站分析首先进去就看到是如此复杂的文字验证码。我们首......
  • 【React工作记录一百零五】springBoot+vue实现登录操作和JWT验证
    前言大家好我是歌谣今天继续进行前后端的一个学习目前进入的是javaweb部分今天来聊聊登录部分和JWT验证部分的书写用户登录loginControllerpackagecom.itheima.controller;importcom.itheima.pojo.Emp;importcom.itheima.pojo.Result;importcom.itheima.service.EmpSer......