You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

go-ozzo/ozzo-validation如何在ValidateStruct中用Min/Max校验结构体字段长度

问题解答

可以在validation.ValidateStruct()中使用Min()校验规则,你原有写法不生效的核心原因是:validation.Min()的默认校验逻辑是对值本身做大小比对:如果传入的是字符串类型,会比较字符串的字典序,而非你预期的字符串长度。

如果要在结构体校验中实现字符串最小长度校验,推荐两种实现方式:

方式1:使用语义更明确的validation.Length规则(优先推荐)

框架专门提供了长度校验规则Length,直接指定最小、最大长度即可:

import (
    "fmt"
    "math"
    "github.com/go-ozzo/ozzo-validation/v4"
)

type Person struct {
    Name string
}

func (c Person) Validate() error {
    return validation.ValidateStruct(&c,
        // 第一个参数为最小长度,第二个为最大长度,传入math.MaxInt表示不限制最大长度
        validation.Field(&c.Name, validation.Length(5, math.MaxInt)),
    )
}

func main() {
    person := Person{
        Name: "Udin",
    }

    if err := person.Validate(); err != nil {
        fmt.Println(err)
    }
}

运行上述代码会输出预期的长度校验错误。

方式2:自定义规则调用Min()实现长度校验

如果你必须使用Min()函数完成校验,可以通过validation.By封装自定义规则,先取字段长度再传入Min()校验:

import (
    "errors"
    "fmt"
    "github.com/go-ozzo/ozzo-validation/v4"
)

func (c Person) Validate() error {
    return validation.ValidateStruct(&c,
        validation.Field(&c.Name, validation.By(func(val interface{}) error {
            str, ok := val.(string)
            if !ok {
                return errors.New("字段类型不合法")
            }
            return validation.Min(5).Validate(len(str))
        })),
    )
}

内容的提问来源于stack exchange,提问作者Ivan Elianto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:45:04