改变我的答案
我已经对您的案例进行了测试并找到了解决方案,您必须使用struct level validation。这是我在您的案例中的功能:
func PostRequestValidation(sl validator.StructLevel) {
address := sl.Current().Interface().(Address)
jsonMarshal, _ := json.Marshal(address)
var m map[string]interface{}
_ = json.Unmarshal(jsonMarshal, &m)
for key, val := range m {
if len(fmt.Sprintf("%s", val)) == 0 {
sl.ReportError(val, key, key, "post", "")
}
}
}
func PutRequestValidation(sl validator.StructLevel) {
address := sl.Current().Interface().(Address)
isValid := false
jsonMarshal, _ := json.Marshal(address)
var m map[string]interface{}
_ = json.Unmarshal(jsonMarshal, &m)
for _, val := range m {
if len(fmt.Sprintf("%s", val)) > 0 {
isValid = true
}
}
if !isValid {
sl.ReportError(address, "address", "Adress", "put", "")
}
}
您只需在每个验证请求上注册
// ON POST REQUEST
validate = validator.New()
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
validate.RegisterStructValidation(PostRequestValidation, Address{})
// ON PUT REQUEST
validate = validator.New()
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
validate.RegisterStructValidation(PutRequestValidation, Address{})
您可以从我的source code 复制以获得更详细的源代码。