我正在嘗試驗證一個具有兩個欄位的結構,其中一個是必需的,另一個不是。
這是結構:
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 欄位的檢查。
我嘗試創建自定義驗證器函式,但由于其中一個欄位不是必需的,我不確定如何構建此條件。
謝謝!
uj5u.com熱心網友回復:
對于驗證器包的更新版本(例如,更高版本v9),您可以使用required_withouttag.
僅當任何其他指定欄位不存在時,驗證中的欄位才必須存在且不為空。對于字串,確保值不是“”。對于切片、映射、指標、介面、通道和函式,確保值不為零。
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{}})
}
uj5u.com熱心網友回復:
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..
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480984.html
