Go ozzo validation验证结构体字段是否在切片中失败问题排查
问题原因及解决方案
核心问题:未正确展开切片参数
你使用validation.In(s.foos)时犯了一个关键错误:validation.In函数接受可变参数(...interface{}),直接传入[]Foo切片会把整个切片当作单个参数传入,此时规则实际是检查currentFoo是否等于这个切片(类型完全不匹配:Foo vs []Foo),而非检查currentFoo是否存在于切片元素中,这就导致明明元素存在却触发错误。
修正代码
只需用...操作符将切片元素展开为可变参数传入:
func (s MyStruct) ValidateInput() error { return validation.ValidateStruct(&s, validation.Field(&s.currentFoo, validation.In(s.foos...).Error("currentfoo not in next foos")), ) }
额外注意点
你的代码中结构体定义为Mystruct(首字母小写),但方法接收者是MyStruct(首字母大写),这属于笔误,需要保持名称一致,否则该方法不属于目标结构体,无法正确调用。
内容的提问来源于stack exchange,提问作者bcsta
相关产品推荐
相关产品推荐

