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