golang之数据验证validator

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"`
}

自定义验证类型

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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"
}

  

posted @   minch  阅读(260)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示