V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz
V2EX  ›  Go 编程语言

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

  •  
  •   Nazz · 187 天前 · 1190 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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(),
        )
    }
    
    14 条回复    2024-06-20 18:11:42 +08:00
    Eilen
        1
    Eilen  
       187 天前
    感觉 Slice 是不是还要考虑拓展下类似
    ```go
    []string{""}
    ```
    Nazz
        2
    Nazz  
    OP
       187 天前
    @Eilen 过滤空字符串 ?
    timnottom
        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
    }


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

    type Basic struct {
    Integer int `json:"integer" valid:"required,min=1,max=5"`
    Float float64 `json:"float" valid:"min=2"`
    }
    Nazz
        13
    Nazz  
    OP
       156 天前
    @maladaxia 用反射的话一堆高星项目可以选择
    lolizeppelin
        14
    lolizeppelin  
       156 天前
    不是有 json schema 校验么 0 0
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2675 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:17 · PVG 13:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.