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 |
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 |