为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕哥9229398 2022-12-13 16:25:24
我正在尝试验证具有两个字段的结构,其中一个是必需的,另一个不是。这是结构:type man struct {    // required: true    Numbers []int `json:"numbers"`    // required: false    Pass bool `json:"pass"`}为了验证我正在使用这个包:https://pkg.go.dev/gopkg.in/validator.v2我的目标是创造以下条件:数字为非零或通过为真。但是,如果我将数字定义为非零值,它将阻止对 Pass 字段的检查。我尝试创建一个自定义的验证器函数,但由于其中一个字段不是必需的,我不确定如何构建此条件。谢谢!
查看完整描述

2 回答

?
慕的地8271018

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{}})

}


查看完整回答
反对 回复 2022-12-13
?
手掌心

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..


查看完整回答
反对 回复 2022-12-13
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号