在 Golang 中使用 OR 条件验证结构的两个字段

我正在尝试验证具有两个字段的结构,其中一个是必需的,另一个不是。


这是结构:


type man struct {

    // required: true

    Numbers []int `json:"numbers"`

    // required: false

    Pass bool `json:"pass"`

}

为了验证我正在使用这个包:https://pkg.go.dev/gopkg.in/validator.v2


我的目标是创造以下条件:


数字为非零或通过为真。


但是,如果我将数字定义为非零值,它将阻止对 Pass 字段的检查。


我尝试创建一个自定义的验证器函数,但由于其中一个字段不是必需的,我不确定如何构建此条件。


谢谢!


慕哥9229398
浏览 213回答 2
2回答

慕的地8271018

对于较新版本的验证程序包(例如,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' tagKey: 'man.Numbers' Error:Field validation for 'Numbers' failed on the 'required_without' tagpasspass不幸的是,v2您只能实现单个字段验证,因此您实际上没有一种很好且直接的方法来访问父结构。您可能必须将该结构包装在另一个结构中才能将其视为man一个字段。type wrapper struct {    man man `validate:"man"`}// Very simple validation funcfunc 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{}})}

手掌心

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..
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go