golang 数据校验器

golang中使用数据校验功能

安装第三方模块

go get gopkg.in/go-playground/validator.v9

基本使用

package main

import (
	"fmt"
	"gopkg.in/go-playground/validator.v9"
)

type User struct {
	Name string `validate:"required"`
	Age  int    `validate:"gte=0,lte=150"`
}

func main() {
	user := User{
		Age: 180,
	}
	validate := validator.New()
	err := validate.Struct(user)
	if err != nil {
		/*
			Key: 'User.Name' Error:Field validation for 'Name' failed on the 'required' tag
			Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
		*/
		fmt.Println(err)
	}
}

在需要结构体的字段中加上key为validate的tag即可

常用的tag验证

required:参数为必须参数

lte: 设置最大值

gte:设置最小值

email: 必须为邮箱格式

url: 必须为合法的url格式

len: 指定字符的长度

max: 和lte一样,设置最大值

min:和gte一样,设置最小值

eq: 值必须等于制定的值,用于字符串和数字

ne: 值必须不等于指定的值, 用于字符串和数字

eqfield: 值必须和指定的字段的值相等

nefield:值必须和指定的字段的值不等

oneof: 相当于枚举, 必须为指定的值的其中一个,不同的值之间用空格隔开

base64: 必须为合法的base64字符串

contains: 值中必须包含给定的字符串

containsany: 值中必须有给定的字符串的任意一个字符

excludes: 值必须不包含给定的字符串

excludesall: 值中必须不包含给定的字符串中的任意一个

startswith: 必须以给定的字符串开头

endwith: 必须以给定的字符结尾

更多文档 https://godoc.org/gopkg.in/go-playground/validator.v9

翻译报错信息

当验证出错时的err不为nil,打印出来的err为英文的字符串

package main

import (
	"fmt"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"gopkg.in/go-playground/validator.v9"
	zhTrans "gopkg.in/go-playground/validator.v9/translations/zh"
)

type User struct {
	Name  string `validate:"required,oneof=ivy niu bi"`
	Hobby string `validate:"containsany=@8888"`
	Age   int    `validate:"gte=0,lte=140,max=150"`
}

func main() {

	validate := validator.New()
	zhCn := zh.New()
	uni := ut.New(zhCn)

	trans, _ := uni.GetTranslator("zh")
	err := zhTrans.RegisterDefaultTranslations(validate, trans)
	if err != nil {
		fmt.Println(err)
	}

	user := User{
		Age:   145,
		Name:  "ivy6",
		Hobby: "666",
	}

	err = validate.Struct(user)
	if err != nil {
		if _, ok := err.(*validator.InvalidValidationError); !ok {
			if errs, ok := err.(validator.ValidationErrors); ok {
				for _, err := range errs {
					/*
						Name:Name必须是[ivy niu bi]中的一个
						Hobby:Hobby必须包含至少一个以下字符'@8888'
						Age:Age必须小于或等于140
					*/
					fmt.Printf("%s:%s \n", err.StructField(), err.Translate(trans))
				}
			}
		}
	}
}

自定义验证规则

package main

import (
	"fmt"
	"gopkg.in/go-playground/validator.v9"
)

type User struct {
	Name string `validate:"test"`
}

func main() {

	validate := validator.New()
	validate.RegisterValidation("test", func(fl validator.FieldLevel) bool {
		return fl.Field().String() == "test"
	})
	//Key: 'User.Name' Error:Field validation for 'Name' failed on the 'test' tag
	fmt.Println(validate.Struct(new(User)))
}

翻译字段名

package main

import (
	"fmt"
	"gopkg.in/go-playground/validator.v9"
	"reflect"
)

type User struct {
	Name string `validate:"required" label:"用户名"`
}

func main() {

	validate := validator.New()
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		return field.Tag.Get("label")
	})
	//Key: 'User.用户名' Error:Field validation for '用户名' failed on the 'required' tag
	fmt.Println(validate.Struct(new(User)))
}

更多参考资料 : https://studygolang.com/articles/28414?fr=sidebar

posted @ 2020-07-22 16:34  Ivy丶  阅读(1580)  评论(0编辑  收藏  举报