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
相关产品推荐
相关产品推荐

