code: func (r *Route) init() error {
  	patternString := r.Pattern
  	var err error
  	if strings.Contains(r.Pattern, ":") {
  		// uriValues is a map of URI Key and it's respective value,
  		// this is calculated per request
  		key := ""
  		hasKey := false
  		hasWildcard := false
  
  		for i := 0; i < len(r.Pattern); i++ {
  			char := string(r.Pattern[i])
  
  			if char == ":" {
  				hasKey = true
  			} else if char == "*" {
  				hasWildcard = true
  			} else if hasKey && char != "/" {
  				key += char
  			} else if hasKey && len(key) > 0 {
  				patternString, err = r.computePatternStr(patternString, hasWildcard, key)
  				if err != nil {
  					return err
  				}
  				hasWildcard, hasKey = false, false
  				key = ""
  			}
  		}
  
  		if hasKey && len(key) > 0 {
  			patternString, err = r.computePatternStr(patternString, hasWildcard, key)
  			if err != nil {
  				return err
  			}
  		}
  	}
  
  	if r.TrailingSlash {
  		patternString = fmt.Sprintf("^%s%s$", patternString, trailingSlash)
  	} else {
  		patternString = fmt.Sprintf("^%s$", patternString)
  	}
  
  	// compile the regex for the pattern string calculated
  	reg, err := regexp.Compile(patternString)
  	if err != nil {
  		return err
  	}
  
  	r.uriPattern = reg
  	r.uriPatternString = patternString
  	return nil
  }
docs: // init prepares the URIKeys, compile regex for the provided pattern