code: func (form Form) GetWithType(name string, typ reflect.Type) (interface{}, bool) {
  	value, exist := form[name]
  	if !exist {
  		return nil, true
  	}
  
  	result, valid := interface{}(nil), false
  
  	if typ.Kind() == reflect.Slice {
  		rv := reflect.MakeSlice(typ, len(value), len(value))
  		elmType := typ.Elem()
  
  		for i, elm := range value {
  			if str, ok := elm.(string); ok {
  				elmValue, valid := form.convert(str, elmType)
  				if !valid {
  					return nil, false
  				}
  
  				rv.Index(i).Set(reflect.ValueOf(elmValue))
  			} else {
  				return nil, false
  			}
  		}
  
  		result, valid = rv.Interface(), true
  	} else if len(value) > 0 {
  		if str, ok := value[0].(string); ok {
  			result, valid = form.convert(str, typ)
  		}
  	}
  
  	return result, valid
  }
docs: // GetWithType returns value given from given name and type.
  // second return value will only be false if the type of parameter is not convertible to requested type.
  // If value is not convertible to type, it'll return nil, false
  // If value is not exists, it will return nil, true