code: func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) {
  	if len(tag) == 0 || tag == skipValidationTag {
  		return nil
  	}
  	ctag := v.fetchCacheTag(tag)
  	otherVal := reflect.ValueOf(other)
  	vd := v.pool.Get().(*validate)
  	vd.top = otherVal
  	vd.isPartial = false
  	vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)
  
  	if len(vd.errs) > 0 {
  		err = vd.errs
  		vd.errs = nil
  	}
  	v.pool.Put(vd)
  	return
  }
docs: // VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and
  // allows passing of contextual validation validation information via context.Context.
  // eg.
  // s1 := "abcd"
  // s2 := "abcd"
  // validate.VarWithValue(s1, s2, "eqcsfield") // returns true
  //
  // WARNING: a struct can be passed for validation eg. time.Time is a struct or
  // if you have a custom type and have registered a custom type handler, so must
  // allow it; however unforeseen validations will occur if trying to validate a
  // struct that is meant to be passed to 'validate.Struct'
  //
  // 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.
  // validate Array, Slice and maps fields which may contain more than one error