code: func isEqCrossStructField(fl FieldLevel) bool {
  
  	field := fl.Field()
  	kind := field.Kind()
  
  	topField, topKind, ok := fl.GetStructFieldOK()
  	if !ok || topKind != kind {
  		return false
  	}
  
  	switch kind {
  
  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  		return topField.Int() == field.Int()
  
  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  		return topField.Uint() == field.Uint()
  
  	case reflect.Float32, reflect.Float64:
  		return topField.Float() == field.Float()
  
  	case reflect.Slice, reflect.Map, reflect.Array:
  		return int64(topField.Len()) == int64(field.Len())
  
  	case reflect.Struct:
  
  		fieldType := field.Type()
  
  		// Not Same underlying type i.e. struct and time
  		if fieldType != topField.Type() {
  			return false
  		}
  
  		if fieldType == timeType {
  
  			t := field.Interface().(time.Time)
  			fieldTime := topField.Interface().(time.Time)
  
  			return fieldTime.Equal(t)
  		}
  	}
  
  	// default reflect.String:
  	return topField.String() == field.String()
  }
docs: // IsEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value.