code: func (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) {
  	val := reflect.ValueOf(s)
  	top := val
  
  	if val.Kind() == reflect.Ptr && !val.IsNil() {
  		val = val.Elem()
  	}
  
  	if val.Kind() != reflect.Struct || val.Type() == timeType {
  		return &InvalidValidationError{Type: reflect.TypeOf(s)}
  	}
  
  	// good to validate
  	vd := v.pool.Get().(*validate)
  	vd.top = top
  	vd.isPartial = true
  	vd.ffn = fn
  	// vd.hasExcludes = false // only need to reset in StructPartial and StructExcept
  
  	vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil)
  
  	if len(vd.errs) > 0 {
  		err = vd.errs
  		vd.errs = nil
  	}
  
  	v.pool.Put(vd)
  
  	return
  }
docs: // StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates
  // nested structs, unless otherwise specified and also allows passing of contextual validation information via
  // context.Context
  //
  // It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
  // You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.