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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM