Skip to content

Latest commit

 

History

History
154 lines (115 loc) · 3.82 KB

File metadata and controls

154 lines (115 loc) · 3.82 KB

Release v0.2.2

发布日期: 2025-12-08

概述

v0.2.2 是一个功能增强版本,validategen 新增了 duration 验证注解系列,支持指针数值类型的比较验证,并将 @method 注解的验证逻辑从 VSCode 插件移至 CLI 工具。

新特性

validategen: Duration 验证注解

新增三个用于验证 time.Duration 字符串的注解:

@duration - 格式验证

验证字符串是有效的 Go duration 格式(如 1h30m500ms):

// validategen:@validate
type Config struct {
    // validategen:@duration
    Timeout string  // 必须是有效的 duration 格式
}

@duration_min(duration) - 最小值验证

验证 duration 字符串的值不小于指定值:

// validategen:@validate
type Config struct {
    // validategen:@duration_min(1s)
    Timeout string  // 超时时间至少 1 秒

    // validategen:@duration_min(100ms)
    RetryInterval string  // 重试间隔至少 100 毫秒
}

@duration_max(duration) - 最大值验证

验证 duration 字符串的值不大于指定值:

// validategen:@validate
type Config struct {
    // validategen:@duration_max(1h)
    Timeout string  // 超时时间最多 1 小时

    // validategen:@duration_max(30s)
    RetryInterval string  // 重试间隔最多 30 秒
}

组合使用

三个注解可以组合使用,生成的代码会合并为一个代码块,只解析一次:

// validategen:@validate
type Config struct {
    // validategen:@duration
    // validategen:@duration_min(1s)
    // validategen:@duration_max(1h)
    RetryInterval string  // 有效 duration,范围 1s ~ 1h
}

生成的代码(优化后):

if x.RetryInterval != "" {
    if _dur, _err := time.ParseDuration(x.RetryInterval); _err != nil {
        errs = append(errs, fmt.Sprintf("RetryInterval must be a valid duration..."))
    } else {
        if _dur < 1000000000 {
            errs = append(errs, fmt.Sprintf("RetryInterval must be at least 1s..."))
        }
        if _dur > 3600000000000 {
            errs = append(errs, fmt.Sprintf("RetryInterval must be at most 1h..."))
        }
    }
}

性能数据

注解 Mean (1000次) 单次约
@duration (valid) 25.45µs 25.45ns
@duration (invalid) 67.56µs 67.56ns
@duration_min 11.78µs 11.78ns
@duration_max ~11µs ~11ns
组合使用 ~11µs ~11ns

validategen: 指针数值类型支持

@min@max@gt@gte@lt@lte@eq@ne 等比较注解现在支持指针数值类型:

// validategen:@validate
type Config struct {
    // validategen:@min(1)
    // validategen:@max(65535)
    Port *int  // 可选端口,非 nil 时验证范围

    // validategen:@gte(0)
    Timeout *float64  // 可选超时,非 nil 时验证 >= 0
}

生成的代码

if x.Port != nil {
    if *x.Port < 1 {
        errs = append(errs, "Port must be at least 1...")
    }
    if *x.Port > 65535 {
        errs = append(errs, "Port must be at most 65535...")
    }
}

validategen: @method 验证移至 CLI

@method 注解的参数验证从 VSCode 插件移至 CLI 工具,提供更准确的编译时检查:

  • 验证方法是否存在于目标类型上
  • 验证方法签名是否正确(无参数,返回 error
  • 提供清晰的错误信息和位置
错误码 说明
E010 方法不存在
E011 方法签名不正确

文档更新

  • README.md / README_EN.md 新增 duration 验证注解文档
  • 更新注解速查表
  • 添加 duration 基准测试结果

升级指南

从 v0.2.1 升级

直接升级即可,无破坏性变更:

go install github.com/tlipoca9/devgen/cmd/devgen@v0.2.2

如果使用了 duration 验证,重新运行 devgen 生成代码。