【Go】数据验证-validator

前言

在web后端开发中经常会遇到数据验证的问题,对于前后端分离的web应用来说,后端对前端传来的数据应持有完全不信任的态度,我们要验证前端发来的数据是否包含所有必要字段,每个字段的数据是否符合我们的需求等等。这个时候普通的验证方法比较繁琐,在go中我们可以使用validator这个包来进行数据验证。

作者水平有限,有任何问题欢迎在文章下方留言,谢谢!

安装

validator包安装:

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

validator包的验证提示默认是英文的,如果需要翻译成中文则还需安装验证提示翻译包:

go get github.com/go-playground/locales
go get github.com/go-playground/universal-translator

使用方法

将验证规则写在struct对应字段的tag里,validator包会通过反射(reflect)获取struct的tag,进行数据验证。

示例:

package main

// validator数据验证demo
// github.com/go-playground/validator/v10

import (
	"fmt"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTranslations "github.com/go-playground/validator/v10/translations/zh"
	"strings"
)

type User struct {
	UserId   	string `form:"userId" validate:"required,min=5,max=20"`
	Password 	string   `form:"password" validate:"required,min=6,max=25"`
	Email		string	`form:"email" validate:"omitempty,email"`
}

func main() {
	daf := User{
		UserId: "58888888",
		Password: "12345678",
		Email: "1234@",
	}
	// 实例化验证对象
	var validate = validator.New()
	err := validate.Struct(daf)
	if err != nil {
		trans := validateTransInit(validate)
		verrs := err.(validator.ValidationErrors)
		errs := make(map[string]string)
		for key, value := range verrs.Translate(trans) {
			errs[key[strings.Index(key, ".")+1:]] = value
		}
		fmt.Println(errs)
	}
}

// 数据验证翻译器
func validateTransInit(validate *validator.Validate) ut.Translator {
	// 万能翻译器,保存所有的语言环境和翻译数据
	uni := ut.New(zh.New())
	// 翻译器
	trans, _ := uni.GetTranslator("zh")
	//验证器注册翻译器
	err := zhTranslations.RegisterDefaultTranslations(validate, trans)
	if err!=nil {
		fmt.Println(err)
	}
	return trans
}

运行结果:

map[Email:Email必须是一个有效的邮箱]

验证规则

一下列举一部分验证规则,详细验证规则请参考文档:

https://pkg.go.dev/gopkg.in/go-playground/validator.v10

标记标记说明
required必填Field或Struct validate:"required"
omitempty空时忽略Field或Struct validate:"omitempty"
len长度Field validate:"len=0"
eq等于Field validate:"eq=0"
gt大于Field validate:"gt=0"
gte大于等于Field validate:"gte=0"
lt小于Field validate:"lt=0"
lte小于等于Field validate:"lte=0"
min最大值Field validate:"min=1"
max最小值Field validate:"max=2"
required_with其他字段其中一个不为空且当前字段不为空Field validate:"required_with=Field1 Field2"
required_with_all其他所有字段不为空且当前字段不为空Field validate:"required_with_all=Field1 Field2"
required_without其他字段其中一个为空且当前字段不为空Field `validate:“required_without=Field1 Field2”
required_without_all其他所有字段为空且当前字段不为空Field validate:"required_without_all=Field1 Field2"
lowercase符串值是否只包含小写字符Field validate:"lowercase"
uppercase符串值是否只包含大写字符Field validate:"uppercase"
email字符串值包含一个有效的电子邮件Field validate:"email"
json字符串值是否为有效的 JSONField validate:"json"
url符串值是否包含有效的 urlField validate:"url"
uri符串值是否包含有效的 uriField validate:"uri"
base64字符串值是否包含有效的 base64值Field validate:"base64"
contains字符串值包含子字符串值Field validate:"contains=@"
containsany字符串值包含子字符串值中的任何字符Field validate:"containsany=abc"
containsrune字符串值包含提供的特殊符号值Field validate:"containsrune=☢"
excludes字符串值不包含子字符串值Field validate:"excludes=@"
excludesall字符串值不包含任何子字符串值Field validate:"excludesall=abc"
excludesrune字符串值不包含提供的特殊符号值Field validate:"containsrune=☢"
startswith字符串以提供的字符串值开始Field validate:"startswith=abc"
endswith字符串以提供的字符串值结束Field validate:"endswith=abc"
ip字符串值是否包含有效的 IP 地址Field validate:"ip"
ipv4字符串值是否包含有效的 ipv4地址Field validate:"ipv4"
datetime字符串值是否包含有效的 日期Field validate:"datetime"

跨字段验证

如果你想实现让用户输入两次邮箱以保证用户对该邮箱确认无误,后台则需要比较用户输入的两次邮箱是否一致,这个时候跨字段验证就派上用场了。

示例:

type User struct {
	Email   	string `form:"email" validate:"required,email"`
	ConfirmedEmail 	string   `form:"confirmedEmail" validate:"required,mail,eqfield=Email"`
}
eqfield同一结构体字段相等Field validate:"eqfield=Field2"
nefield同一结构体字段不相等Field validate:"nefield=Field2"
gtfield大于同一结构体字段Field validate:"gtfield=Field2"
gtefield大于等于同一结构体字段Field validate:"gtefield=Field2"
ltfield小于同一结构体字段Field validate:"ltfield=Field2"
ltefield小于等于同一结构体字段Field validate:"ltefield=Field2"
eqcsfield跨不同结构体字段相等Struct1.Field validate:"eqcsfield=Struct2.Field2"
necsfield跨不同结构体字段不相等Struct1.Field validate:"necsfield=Struct2.Field2"
gtcsfield大于跨不同结构体字段Struct1.Field validate:"gtcsfield=Struct2.Field2"
gtecsfield大于等于跨不同结构体字段Struct1.Field validate:"gtecsfield=Struct2.Field2"
ltcsfield小于跨不同结构体字段Struct1.Field validate:"ltcsfield=Struct2.Field2"
ltecsfield小于等于跨不同结构体字段Struct1.Field validate:"ltecsfield=Struct2.Field2"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值