in validator.go [142:173]
func tryRecursiveValidate(val reflect.Value, opts *options, validators []validatorTag) error {
var curr interface{}
if val.IsValid() {
curr = val.Interface()
}
if err := runValidators(curr, validators); err != nil {
return err
}
if !val.IsValid() {
return nil
}
t := val.Type()
if (t.Kind() == reflect.Ptr || t.Kind() == reflect.Interface) && val.IsNil() {
return nil
}
var err error
switch chaseValue(val).Kind() {
case reflect.Struct:
err = validateStruct(val, opts)
case reflect.Map:
err = validateMap(val, opts)
case reflect.Array, reflect.Slice:
err = validateArray(val, opts)
}
if err != nil {
return err
}
return tryValidate(val)
}