code: func hasLengthOf(top interface{}, current interface{}, field interface{}, param string) bool {
  
  	st := reflect.ValueOf(field)
  
  	switch st.Kind() {
  
  	case reflect.String:
  		p := asInt(param)
  
  		return int64(utf8.RuneCountInString(st.String())) == p
  
  	case reflect.Slice, reflect.Map, reflect.Array:
  		p := asInt(param)
  
  		return int64(st.Len()) == p
  
  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  		p := asInt(param)
  
  		return st.Int() == p
  
  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  		p := asUint(param)
  
  		return st.Uint() == p
  
  	case reflect.Float32, reflect.Float64:
  		p := asFloat(param)
  
  		return st.Float() == p
  	}
  
  	panic(fmt.Sprintf("Bad field type %T", field))
  }
docs: // length tests whether a variable's length is equal to a given
  // value. For strings it tests the number of characters whereas
  // for maps and slices it tests the number of items.