golang-参数校验

之前使用 Java 的时候有 hibernate-validator 这个库进行参数校验

那么在Golang语言中,也有类似的校验库

安装校验库

go get github.com/go-playground/validator/v10

使用

import "github.com/go-playground/validator/v10"

使用方式

会看到 structtag 位置加上了 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容