Golang - Validator.v9操作

1、請看示例代碼
/**
 * Created by Goland.
 * User: yan.wang5
 * Date: 2019/12/01
 */
package main

import (
	"fmt"
	"github.com/go-playground/locales/en"
	"github.com/go-playground/locales/zh"
	"github.com/go-playground/universal-translator"
	"gopkg.in/go-playground/validator.v9"
	en_translations "gopkg.in/go-playground/validator.v9/translations/en"
	zh_translations "gopkg.in/go-playground/validator.v9/translations/zh"
	"reflect"
	"regexp"
)

var vd *validator.Validate
var translators = make(map[string]ut.Translator, 2)

// 初始化驗證器
func init() {
	vd = validator.New()

	// 使用json標籤
	vd.RegisterTagNameFunc(func(field reflect.StructField) string {
		return field.Tag.Get("json")
	})

	// 註冊英文錯誤提示器
	_en := en.New()
	translators["en"], _ = ut.New(_en, _en).GetTranslator("en")
	_ = en_translations.RegisterDefaultTranslations(vd, translators["en"])

	// 註冊中文錯誤提示器
	_zh := zh.New()
	translators["zh"], _ = ut.New(_zh, _zh).GetTranslator("zh")
	_ = zh_translations.RegisterDefaultTranslations(vd, translators["zh"])

	// 註冊一個國家碼驗證器
	_ = vd.RegisterValidation("cc", func(fl validator.FieldLevel) bool {
		ok, _ := regexp.MatchString(`^[1-9][0-9]{1,2}$`, fl.Field().String())
		return ok
	})
	RegisterTagTranslation("cc", map[string]string{
		"en": "{0} is a invalid cc.",
		"zh": "{0}不是一個可用的國家碼",
	})

	// 註冊一個手機號碼驗證器
	_ = vd.RegisterValidation("phone", func(fl validator.FieldLevel) bool {
		ok, _ := regexp.MatchString(`^1[3-9][0-9]{9}$`, fl.Field().String())
		return ok
	})
	RegisterTagTranslation("phone", map[string]string{
		"en": "{0} is a invalid phone.",
		"zh": "{0}不是一個可用的手機號碼",
	})

	// 給required_with添加翻譯
	RegisterTagTranslation("required_with", map[string]string{
		"en": "{0} is required field.",
		"zh": "{0}是一個必填字段",
	})
}

// 自定義翻譯
func RegisterTagTranslation(tag string, messages map[string]string) {
	for lang, message := range messages {
		_ = vd.RegisterTranslation(tag, translators[lang], func(ut ut.Translator) error {
			return ut.Add(tag, message, false)
		}, func(ut ut.Translator, fe validator.FieldError) string {
			t, err := ut.T(fe.Tag(), fe.Field())
			if err != nil {
				return fe.(error).Error()
			}
			return t
		})
	}
}

type User struct {
	Cc    string `json:"cc" validate:"omitempty,cc"`
	Phone string `json:"phone" validate:"required_with=Cc,omitempty,phone"`
	Age   uint   `json:"age" validate:"min=10"`
}

func main() {
	var user = User{Cc: "1",Phone: "123", Age: 9}

	if errs := vd.Struct(&user); errs != nil {
		for _, err := range errs.(validator.ValidationErrors) {
			fmt.Printf("%s\n", err.Translate(translators["zh"]))
		}
	}

	/*
		cc不是一個可用的國家碼
		phone不是一個可用的手機號碼
		age最小隻能爲10
	*/
}
2、驗證規則

英文文檔:https://godoc.org/gopkg.in/go-playground/validator.v9

字段
required
required_with
required_with_all
required_without
required_without_all
isdefault
len
min
max
eq
ne
lt
lte
gt
gte
eqfield
eqcsfield
necsfield
gtcsfield
gtecsfield
ltcsfield
ltecsfield
nefield
gtefield
gtfield
ltefield
ltfield
fieldcontains
fieldexcludes
alpha
alphanum
alphaunicode
alphanumunicode
numeric
number
hexadecimal
hexcolor
rgb
rgba
hsl
hsla
email
url
uri
urn_rfc2141
file
base64
base64url
contains
containsany
containsrune
excludes
excludesall
excludesrune
startswith
endswith
isbn
isbn10
isbn13
eth_addr
btc_addr
btc_addr_bech32
uuid
uuid3
uuid4
uuid5
uuid_rfc4122
uuid3_rfc4122
uuid4_rfc4122
uuid5_rfc4122
ascii
printascii
multibyte
datauri
latitude
longitude
ssn
ipv4
ipv6
ip
cidrv4
cidrv6
cidr
tcp4_addr
tcp6_addr
tcp_addr
udp4_addr
udp6_addr
udp_addr
ip4_addr
ip6_addr
ip_addr
unix_addr
mac
hostname
hostname_rfc1123
fqdn
unique
oneof
html
html_encoded
url_encoded
dir
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章