gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:24:35 25 4
gpt4 key购买 nike

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

这是结构:

type man struct {
// required: true
Numbers []int `json:"numbers"`
// required: false
Pass bool `json:"pass"`
}

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

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

Numbers 为非零或 pass 为真。

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

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

谢谢!

最佳答案

使用较新版本的验证程序包(例如 v9 以上),您可以使用 required_without标签。

The field under validation must be present and not empty only when any of the other specified fields are not present. For strings ensures value is not "". For slices, maps, pointers, interfaces, channels and functions ensures the value is not nil.

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

关于validation - 在 Golang 中使用 OR 条件验证结构的两个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72268799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com