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

ozzo-validation的In规则对相等值返回错误,求排查原因

ozzo-validation数组元素In规则校验失败排查

问题重现

使用echo框架+ozzo-validation做请求校验,编写的Validate方法如下:

func (a MyRequest) Validate() error {
    return validation.ValidateStruct(
        &a,
        validation.Field(&a.Value,
            validation.Required,
            validation.Length(1, 5),
            validation.Each(validation.NilOrNotEmpty, validation.In([]string{"true", "false"}),
            ),
        ),
    )
}

发送请求:

{"value":["true"]}

收到错误提示:

value: (0: must be a valid value.).

但直接用==和reflect.DeepEqual检查值时,结果均为相等:

fmt.Println(reflect.DeepEqual([]string{"true", "false"}[0], a.Value[0]))
fmt.Println([]string{"true", "false"}[0] == a.Value[0])

// 输出:
true
true

问题原因

ozzo-validation的validation.In()规则接收的是可变参数,而非切片。直接传入[]string{"true", "false"}时,规则会把整个切片当作一个单一的可选值——相当于校验元素是否等于这个切片本身,显然字符串"true"和切片[]string{"true","false"}不可能相等,因此触发错误。

解决方案

将切片通过...语法展开为可变参数传入In规则:

func (a MyRequest) Validate() error {
    return validation.ValidateStruct(
        &a,
        validation.Field(&a.Value,
            validation.Required,
            validation.Length(1, 5),
            validation.Each(
                validation.NilOrNotEmpty,
                validation.In([]string{"true", "false"}...), // 用...展开切片
            ),
        ),
    )
}

修改后,In规则会正确把"true"、"false"作为两个独立的可选值,对数组中的每个元素进行校验。

内容的提问来源于stack exchange,提问作者Zeinab Abbasimazar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:15:10