之前使用 Java 的时候有
hibernate-validator这个库进行参数校验
那么在Golang语言中,也有类似的校验库
安装校验库
go get github.com/go-playground/validator/v10
使用
import "github.com/go-playground/validator/v10"
使用方式
会看到
struct的tag位置加上了validate:"required",这个库就是通过tag进行校验
type UserLogin struct {
Username string `json:"username" validate:"required"` // 登录名
Password string `json:"password" validate:"required"` // 密码
}
简单使用
var validate *validator.Validate
func main() {
validate = validator.New()
userLogin := &UserLogin{
.....
}
// 开始校验
err := validate.Struct(userLogin)
if err != nil {
// 输出校验信息
// 但是输出的是英文版的校验信息
fmt.Println(err.Error())
}
}
但是这个输出的是 英文版本的校验信息,不符合我们的情况
使用语言中文
validate := validator.New()
zh_ch := zh.New()
uni := ut.New(zh_ch)
trans, _ := uni.GetTranslator("zh")
//验证器注册翻译器
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 = "请求参数错误"
)
// ValidateData 全局model数据验证器
func Validate(dataStruct interface{}) error {
//验证
zh_ch := zh.New()
validate := validator.New()
//注册一个函数,获取struct tag里自定义的label作为字段名
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// name := fld.Tag.Get("label")
// return name
// })
// 设置语言为中文
uni := ut.New(zh_ch)
trans, _ := uni.GetTranslator("zh")
//验证器注册翻译器
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
}
使用
// 创建用户
func (s *UserService) Create(userDto *dto.UserDTO) (*dto.UserDTO, error) {
// 参数校验
vaildErrs := core.Validate(userDto)
if vaildErrs != nil {
// 会输出中文的校验信息
return nil, errors.New(vaildErrs.Error())
}
.....省略其他代码
}
常用的标记

image.png