https://github.com/lxzan/passport
不如结构体标签紧凑, 但是性能更好, 有编译检查和代码提示
type Req struct {
Name string `json:"name"`
Typ int `json:"typ"`
Age int `json:"age"`
Roles []int `json:"roles"`
}
func (c *Req) Validate() error {
return passport.Validate(
passport.String("Name", c.Name).Required().Alphabet(),
passport.Ordered("Typ", c.Typ).IncludeBy(1, 3, 5),
passport.Ordered("Age", c.Age).Gte(18),
passport.Slice("Roles", c.Roles).Required(),
)
}
1
Eilen 187 天前
感觉 Slice 是不是还要考虑拓展下类似
```go []string{""} ``` |
3
timnottom 187 天前 1
能定义错误提示信息?
感觉不行,但是个人项目,总感觉用着不放心; 目前,我是使用如下方法: ```go type UpdateArrCacheParams struct { ID int64 `json:"id" binding:"required"` Name string `json:"name" binding:"required"` Values []any `json:"values" binding:"required"` } func (u UpdateArrCacheParams) GetMessages() valid.ValidatorMessages { return valid.ValidatorMessages{ "ID.required": "请输入 ID", "Name.required": "请输入名称", "Values.required": "请输入值", } } type Validator interface { GetMessages() ValidatorMessages } type ValidatorMessages map[string]string // GetErrorMsg 获取错误信息 func GetErrorMsg(request any, err error) error { var validationErrors validator.ValidationErrors if errors.As(err, &validationErrors) { _, isValidator := request.(Validator) for _, v := range err.(validator.ValidationErrors) { // 若 request 结构体实现 Validator 接口即可实现自定义错误信息 if isValidator { if message, exist := request.(Validator).GetMessages()[v.Field()+"."+v.Tag()]; exist { return errors.New(message) } } return v } } return ErrParams } ``` |
4
timnottom 187 天前
先 star 了,观望观望
|
7
vchroc 183 天前
可以参考 JSR 380 Bean Validation 的 API 设计
|
12
maladaxia 156 天前
不如我写的检查器简洁啊
type Basic struct { Integer int `json:"integer" valid:"required,min=1,max=5"` Float float64 `json:"float" valid:"min=2"` } |
14
lolizeppelin 156 天前
不是有 json schema 校验么 0 0
|