• 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 
    ", 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

  • 相关阅读:
    Android中内容观察者的使用 ContentObserver类详解 (转)
    Spinner
    对话框
    ButtonBar 的使用
    EditText/RadioButton/CheckBox使用
    ListView
    PieChar,此代码参考网上
    ComboBox中使用事件
    ColorPicker
    Button
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/13361599.html
Copyright © 2020-2023  润新知