2 回答

TA贡献1796条经验 获得超4个赞
对于较新版本的验证程序包(例如,v9以后的版本),您可以使用required_without标签。
仅当任何其他指定字段不存在时,验证字段必须存在且不为空。对于字符串,确保值不是“”。对于切片、映射、指针、接口、通道和函数,确保值不为零。
type man struct {
Numbers []int `json:"numbers" validate:"required_without=Pass"`
Pass bool `json:"pass"`
}
使用不同的输入进行测试:
man{}
man{nil, false}
man{nil, true}
man{[]int{}, false}
给出:
Key: 'man.Numbers' Error:Field validation for 'Numbers' failed on the 'required_without' tag
Key: 'man.Numbers' Error:Field validation for 'Numbers' failed on the 'required_without' tag
pass
pass
不幸的是,v2您只能实现单个字段验证,因此您实际上没有一种很好且直接的方法来访问父结构。您可能必须将该结构包装在另一个结构中才能将其视为man一个字段。
type wrapper struct {
man man `validate:"man"`
}
// Very simple validation func
func manValidator(v interface{}, param string) error {
m := v.(man)
if m.Numbers != nil || m.Pass {
return nil
}
return errors.New("validation failed")
}
func main() {
validate.SetValidationFunc("man", manValidator)
validator.Validate(wrapper{man{}})
}

TA贡献1942条经验 获得超3个赞
type Man struct {
// required: true
Numbers []int `json:"numbers" cond1:"nonnil"`
// required: false
Pass bool `json:"pass" cond2:"nonzero"`
}
func main() {
// ....
cond1Validator := validator.NewValidator()
cond1Validator.SetTag("cond1")
cond2Validator := validator.NewValidator()
cond2Validator.SetTag("cond2")
if errs := cond1Validator.Validate(man); errs != nil {
if errs := cond2Validator.Validate(man); errs != nil {
log.Fatalln(errs)
}
}
// ....
}
您可以尝试自定义标签名称和多个 vaidators..
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报