基于泛型实现的数据校验器, 有兴趣了解下吗?

219 天前
 Nazz

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(),
    )
}
1217 次点击
所在节点    Go 编程语言
14 条回复
Eilen
218 天前
感觉 Slice 是不是还要考虑拓展下类似
```go
[]string{""}
```
Nazz
218 天前
@Eilen 过滤空字符串 ?
timnottom
218 天前
能定义错误提示信息?

感觉不行,但是个人项目,总感觉用着不放心;

目前,我是使用如下方法:


```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
}


```
timnottom
218 天前
先 star 了,观望观望
Nazz
218 天前
@timnottom 刚发了 v0.0.1, 还没去做高级功能, 仅提供一种新的思路
timnottom
218 天前
@Nazz #5 期待新版本
vchroc
215 天前
可以参考 JSR 380 Bean Validation 的 API 设计
Nazz
215 天前
@vchroc Java 靠的是注解
vchroc
215 天前
@Nazz 所以是参考。还有分组校验的功能
supuwoerc
212 天前
@Nazz 加自定义错误信息的话可能要考虑国际化
Nazz
212 天前
@supuwoerc 已经加了 i18n
maladaxia
188 天前
不如我写的检查器简洁啊

type Basic struct {
Integer int `json:"integer" valid:"required,min=1,max=5"`
Float float64 `json:"float" valid:"min=2"`
}
Nazz
188 天前
@maladaxia 用反射的话一堆高星项目可以选择
lolizeppelin
188 天前
不是有 json schema 校验么 0 0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1042313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX