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 關注
- 150 瀏覽
添加回答
舉報