之前使用 Java 的時(shí)候有
hibernate-validator
這個(gè)庫(kù)進(jìn)行參數(shù)校驗(yàn)
那么在Golang語(yǔ)言中阎姥,也有類似的校驗(yàn)庫(kù)
安裝校驗(yàn)庫(kù)
go get github.com/go-playground/validator/v10
使用
import "github.com/go-playground/validator/v10"
使用方式
會(huì)看到
struct
的tag
位置加上了validate:"required"
芦劣,這個(gè)庫(kù)就是通過(guò)tag
進(jìn)行校驗(yàn)
type UserLogin struct {
Username string `json:"username" validate:"required"` // 登錄名
Password string `json:"password" validate:"required"` // 密碼
}
簡(jiǎn)單使用
var validate *validator.Validate
func main() {
validate = validator.New()
userLogin := &UserLogin{
.....
}
// 開(kāi)始校驗(yàn)
err := validate.Struct(userLogin)
if err != nil {
// 輸出校驗(yàn)信息
// 但是輸出的是英文版的校驗(yàn)信息
fmt.Println(err.Error())
}
}
但是這個(gè)輸出的是 英文版本的校驗(yàn)信息,不符合我們的情況
使用語(yǔ)言中文
validate := validator.New()
zh_ch := zh.New()
uni := ut.New(zh_ch)
trans, _ := uni.GetTranslator("zh")
//驗(yàn)證器注冊(cè)翻譯器
zh_translations.RegisterDefaultTranslations(validate, trans)
那么返回的信息就是中文信息蜻展,比較符合
{
"code": 0,
"msg": "Email為必填字段",
"data": null
}
完整代碼
package core
import (
"errors"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"
)
const (
BadRequest = "請(qǐng)求參數(shù)錯(cuò)誤"
)
// ValidateData 全局model數(shù)據(jù)驗(yàn)證器
func Validate(dataStruct interface{}) error {
//驗(yàn)證
zh_ch := zh.New()
validate := validator.New()
//注冊(cè)一個(gè)函數(shù),獲取struct tag里自定義的label作為字段名
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// name := fld.Tag.Get("label")
// return name
// })
// 設(shè)置語(yǔ)言為中文
uni := ut.New(zh_ch)
trans, _ := uni.GetTranslator("zh")
//驗(yàn)證器注冊(cè)翻譯器
zh_translations.RegisterDefaultTranslations(validate, trans)
err := validate.Struct(dataStruct)
if err != nil {
for _, err := range err.(validator.ValidationErrors) {
return errors.New(err.Translate(trans))
}
}
return nil
}
使用
// 創(chuàng)建用戶
func (s *UserService) Create(userDto *dto.UserDTO) (*dto.UserDTO, error) {
// 參數(shù)校驗(yàn)
vaildErrs := core.Validate(userDto)
if vaildErrs != nil {
// 會(huì)輸出中文的校驗(yàn)信息
return nil, errors.New(vaildErrs.Error())
}
.....省略其他代碼
}