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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容