首页 > 其他分享 >Go结构体数据校验

Go结构体数据校验

时间:2023-01-08 06:44:39浏览次数:37  
标签:PassWord addr 校验 validator Go validate 结构 string

github.com/go-playground/validator

范围约束

  • 对于字符串、切片、数组和map,约束其长度。

    len=10, min=6, max=10, gt=10

  • 对于数值,约束其取值。

    min, max, eq, ne, gt, gte, lt, lte, oneof=6 8

Fields

标签 描述
eqcsfield 字段等于另一个字段(相对)
eqfield 字段等于另一个字段
fieldcontains 没有记录在 doc.go 中
fieldexcludes 没有记录在 doc.go 中
gtcsfield 大于另一个相关字段的字段
gtecsfield 字段大于或等于另一个相关字段
gtefield 字段大于或等于另一个字段
gtfield 字段大于另一个字段
ltcsfield 小于另一个相关字段
ltecsfield 小于或等于另一个相关字段
ltefield 小于或等于另一个字段
ltfield 小于另一个字段
necsfield 字段不等于另一个字段(相对)
nefield 字段不等于另一个字段

网络

标签 描述
cidr 无类域间路由 CIDR
cidrv4 无类域间路由 CIDRv4
cidrv6 无类域间路由 CIDRv6
datauri 资料网址
fqdn 完全限定域名 (FQDN)
hostname 主机名 RFC 952
hostname_port 主机端口
hostname_rfc1123 主机名 RFC 1123
ip 互联网协议地址 IP
ip4_addr 互联网协议地址 IPv4
ip6_addr 互联网协议地址 IPv6
ip_addr 互联网协议地址 IP
ipv4 互联网协议地址 IPv4
IPv6 互联网协议地址 IPv6
mac 媒体访问控制地址 MAC
tcp4_addr 传输控制协议地址 TCPv4
tcp6_addr 传输控制协议地址 TCPv6
tcp_addr 传输控制协议地址 TCP
udp4_addr 用户数据报协议地址 UDPv4
udp6_addr 用户数据报协议地址 UDPv6
udp_addr 用户数据报协议地址 UDP
unix_addr Unix域套接字端点地址
uri 字符串
url 网址字符串
url_encoded 网址编码
urn_rfc2141 瓮 RFC 2141 字符串

字符串

标签 描述
alpha 仅限阿尔法
alphanum 字母数字
alphanumunicode 字母数字 Unicode
alphaunicode 阿尔法统一码
ascii ASCII码
boolean 布尔值
contains 包含
containsany 包含任何
containsrune 包含符文
endsnotwith 结尾不是
endswith 以。。结束
excludes 排除
excludesall 排除所有
excludesrune 不包括符文
lowercase 小写
multibyte 多字节字符
number 没有记录在 doc.go 中
numeric 数字
printascii 可打印的 ASCII
startsnotwith 开头不是
startswith 以。。开始
uppercase 大写

格式

标签 描述
base64 Base64 字符串
base64url Base64URL 字符串
bic 企业识别码 (ISO 9362)
bcp47_language_tag 语言标签 (BCP 47)
btc_addr 比特币地址
btc_addr_bech32 比特币 Bech32 地址(segwit)
credit_card 信用卡号
datetime 约会时间
e164 e164格式电话号码
email 电子邮件字符串
eth_addr 以太坊地址
hexadecimal 十六进制字符串
hexcolor 六角色字符串
hsl HSL字符串
hsla HSLA 字符串
html HTML标签
html_encoded HTML编码
isbn 国际标准书号
isbn10 国际标准书号 10
isbn13 国际标准书号 13
iso3166_1_alpha2 两个字母的国家代码 (ISO 3166-1 alpha-2
iso3166_1_alpha3 三字母国家代码 (ISO 3166-1 alpha-3)
iso3166_1_alpha_numeric 数字国家代码(ISO 3166-1 数字)
iso3166_2 国家细分代码 (ISO 3166-2)
iso4217 货币代码 (ISO 4217)
JSON JSON
jwt JSON 网络令牌 (JWT)
latitude 纬度
longitude 经度
postcode_iso3166_alpha2 邮政编码
postcode_iso3166_alpha2_field 邮政编码
RGB RGB 字符串
rgba RGBA字符串
ssn 社会保险号 SSN
timezone 时区
uuid 通用唯一标识符 UUID
uuid3 通用唯一标识符 UUID v3
uuid3_rfc4122 通用唯一标识符 UUID v3 RFC4122
uuid4 通用唯一标识符 UUID v4
uuid4_rfc4122 通用唯一标识符 UUID v4 RFC4122
uuid5 通用唯一标识符 UUID v5
uuid5_rfc4122 通用唯一标识符 UUID v5 RFC4122
uuid_rfc4122 通用唯一标识符 UUID RFC4122
MD4 MD4哈希
MD5 MD5哈希
sha256 SHA256 哈希
sha384 SHA384 哈希
sha512 SHA512 哈希
ripemd128 RIPEMD-128 哈希
ripemd160 RIPEMD-160 哈希
tiger128 TIGER128 哈希
tiger160 TIGER160 哈希
tiger192 TIGER192 哈希
semver 语义版本控制 2.0.0
ulid 普遍唯一的字典排序标识符 ULID

比较

标签 描述
eq 等于
gt 比...更棒
gte 大于或等于
lt 少于
lte 小于或等于
ne 不等于

其他

标签 描述
dir 目录
file 文件路径
isdefault 是默认的
len 长度
max 最大
min 最低限度
oneof 之一
required 必需的
required_if 如果需要
required_unless 要求除非
required_with 要求与
required_with_all 全部需要
required_without 需要 没有
required_without_all 没有全部需要
excluded_if 如果排除
excluded_unless 排除除非
excluded_with 排除在外
excluded_with_all 全部排除
excluded_without 排除无
excluded_without_all 没有全部排除
unique 独特的

简单使用

package main

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

func fn5() {
	//创建结构体  设置校验
	type RegistRequest struct {
		UserName   string `validate:"gt=0"`             // >0 长度大于0
		PassWord   string `validate:"min=6,max=12"`     //密码长度[6, 12]
		PassRepeat string `validate:"eqfield=PassWord"` //跨字段相等校验
		Email      string `validate:"email"`            //需要满足email的格式
	}

	reg := RegistRequest{
		UserName:   "1",
		PassWord:   "abc",
		PassRepeat: "abcdef",
		Email:      "123.com",
	}
	//创建校验
	v := validator.New()
	//校验
	err := v.Struct(reg) //Struct()返回的error分为两种类型:InvalidValidationError和ValidationErrors
	//根据返回的错误,做出相应的处理
	if err != nil {
		//InvalidValidationError是传入了非法的参数
		invalid, ok := err.(*validator.InvalidValidationError)
		if ok {
			fmt.Println("传输的参数有误", "\n错误消息为:", invalid)
		}
		//ValidationErrors是对校验的不通过的返回
		validationErrs := err.(validator.ValidationErrors)
		for _, v := range validationErrs {
			fmt.Println(v.Field(), "不满足要求", v.Tag())
		}
	}
}

func main() {
	fn5()
}
/*
PassWord 不满足要求 min
PassRepeat 不满足要求 eqfield
Email 不满足要求 email
*/

要点

  • 需要先初始化校验 v := validator.New() 用返回的v来校验结构体
  • 校验 将结构体传入 err := v.Struct(reg) 返回的是校验结果
  • func (v *Validate) Struct(s interface{}) error返回的error分为两种类型:InvalidValidationErrorValidationErrors
    • InvalidValidationError类型的err是传参异常
    • ValidationErrors 类型则是对校验结果的返回,是一个切片
    • 需要手动的去断言

跨字段约束

  • 跨字段就在范围约束的基础上加field后缀。范围约束+field。例如eqfield
  • 如果还跨结构体(cross struct)就在跨字段的基础上在field前面加cs:范围约束+cs+field。例如eqcsfield

跨字段指的是不同结构体

//结构体嵌套 然后之间的字段相互校验
type User struct {
	Passwd string `validate:"min=6,max=12"`
}

type RegistRequest struct {
	UserName  string `validate:"gt=0"`                  // >0 长度大于0
	PassWord  string `validate:"eqcsfield=User.Passwd"` //跨结构体相等校验
	Rpassword string `validate:"eqfield=PassWord"`      //跨字段相等校验
	User      User
}

reg := RegistRequest{
	UserName:  "1",
	PassWord:  "abcd",
	Rpassword: "abcd",
	User:      User{Passwd: "abcdef"},
}

字符串约束

  • contains包含子串。
  • containsany包含任意unicode字符, containsany=abcd。
  • containsrune包含rune字符, containsrune= ☻。
  • excludes不包含子串。
  • excludesall不包含任意的unicode字符,excludesall=abcd。
  • excludesrune不包含rune字符,excludesrune=☻。
  • startswith以子串为前缀。
  • endswith以子串为后缀。
type RegistRequest struct {
	UserName  string `validate:"contains=abcd"`    //包含校验
	PassWord  string `validate:"excludes=abcd"`    //不包含校验
	RPassWord string `validate:"containsany=abcd"` //至少包含其中的一个
}
reg := RegistRequest{
	UserName:  "1abcd",  //通过
	PassWord:  "abcdef", //不通过
	RPassWord: "a123",   //通过
}

唯一性uniq

  • 对于数组和切片,约束没有重复的元素。
  • 对于map,约束没的重复的value。
  • 对于元素类型为结构体的切片,unique约束结构体对象的某个字段不重复,通过unique=field指定这个字段名。
    Friends []User validate:"unique=Name"
type RegistRequest struct {
	Id       []int  `validate:"unique"` //唯一性校验
	UserName string `validate:"gt=0"`
	PassWord string `validate:"min=6,max=12"`
}
reg := RegistRequest{
	Id:       []int{1, 2, 1},
	UserName: "1",
	PassWord: "abcdef",
}

自定义约束

func validateEmail(fl validator.FieldLevel) bool {
    input := fl.Field().String()
    if pass, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,})\.([a-z]{2,4})$`, input); pass {
	  return true
 }
 return false
}

//注册一个自定义的validator
val.RegisterValidation("my_email", validateEmail)

Email string `validate:"my_email"`

例子

package main

import (
	"fmt"

	"github.com/go-playground/validator"
)

//新建校验函数
func Jiaoyan(fl validator.FieldLevel) bool {
	field := fl.Field().String()
	if field != "abc" {
		return false
	}
	return true
}

func fn5() {
	//创建结构体  设置校验
	type RegistRequest struct {
        //调用校验方法
		UserName string `validate:"jiaoyan"` //自定义校验
		Passwd   string `validate:"jiaoyan"`
	}

	reg := RegistRequest{
		UserName: "abc",  //通过
		Passwd:   "ab1c", //不通过
	}
	//创建校验
	v := validator.New()
    
    //注册校验方法
	v.RegisterValidation("jiaoyan", Jiaoyan)
	//校验
	err := v.Struct(reg) //Struct()返回的error分为两种类型:InvalidValidationError和ValidationErrors
	//根据返回的错误,做出相应的处理
	if err != nil {
		//InvalidValidationError是传入了非法的参数
		invalid, ok := err.(*validator.InvalidValidationError)
		if ok {
			fmt.Println("传输的参数有误", "\n错误消息为:", invalid)
		}
		//ValidationErrors是对校验的不通过的返回
		validationErrs := err.(validator.ValidationErrors)
		for _, v := range validationErrs {
			fmt.Println(v.Field(), "不满足要求", v.Tag())
		}
	}
}

func main() {
	fn5()
}

标签:PassWord,addr,校验,validator,Go,validate,结构,string
From: https://www.cnblogs.com/guangdelw/p/17034047.html

相关文章

  • Go实现String方法
    给结构体实现String()sting方法,方便按照我们想看的方式打印出来fmt.Println(),类似与python的__str__和__repr__packagemain_testimport( "fmt" "github.com/byteda......
  • Go语言学习day2
    1.go的结构体没有构造函数,但是可以自己实现一个。由于值拷贝的开销比较大,所以返回的是结构体指针类型packagemainimport"fmt"typepersonstruct{ name,citystr......
  • go in action学习,go语法一些特殊点
    1.如果接口类型只包含一个方法,那么这个类型的名字以er结尾。如果接口类型内部声明了多个方法,其名字需要与其行为关联。2.如果要让一个用户定义的类型实现一个接口,这个用......
  • 适合编程初学者的开源项目:小游戏2048(Go语言版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。2048游戏规则一共16个单元格,初始时由2或者4构成。1、手指向一个方向滑动,所有格子会向那个方向运动。2......
  • Switch多选择结构
    Switch多选择结构多选择结构还有一个实现方式就是switchcase语句。switchcase语句判断一个变量与一系列值中某个值是否相等,每个值成为一个分支。switch(expressi......
  • go自学笔记
    自己啃官网,搞成能用的系统;]golang语言环境下载地址:http://go.p2hp.com/#google_vignette一直下一步安装,完成cmd:goversion看版本,是否安装成功在文件管理器......
  • p27-28结构体与结构体数组,sizeof使用以及给数组赋值
    sizeof可以使用类型,也可以使用变量可以判断其长度一个数组,所有成员一样,但顺序不一样结果占用空间不一样原因:字节对齐(结构体对齐)字节对齐本质:效率还是空间,二选一的结果......
  • 结构体和共用体
    结构体和共用体结构体变量C语言数据类型:基本类型整型类型:基本整型(int)、短整型(shortint)、长整型(longint)、双长整型(longlongint)、字符型(char)、布尔型(bo......
  • .net core操作MongoDB
    前言现实中认识的一个搞java(百万富婆)的大佬,已经转行做抖音主播了,搞技术的只能赶在年前再水一篇博客,不足之处欢迎拍砖,以免误人子弟,呔,真是太难受了环境准备.ne......
  • Golang入门到实战核心编程-第五章-程序流程控制
    目录1.程序流程控制1.1程序流程个控制介绍1.2三大流程控制介绍及案例1.2.1顺序流程控制1.2.1.1顺利流程控制介绍1.2.1.2顺序流程控制流程图1.2.1.3顺序流程控制案例......