之前使用 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