code: func (r *routeRegexp) url(values map[string]string) (string, error) {
  	urlValues := make([]interface{}, len(r.varsN))
  	for k, v := range r.varsN {
  		value, ok := values[v]
  		if !ok {
  			return "", fmt.Errorf("mux: missing route variable %q", v)
  		}
  		if r.regexpType == regexpTypeQuery {
  			value = url.QueryEscape(value)
  		}
  		urlValues[k] = value
  	}
  	rv := fmt.Sprintf(r.reverse, urlValues...)
  	if !r.regexp.MatchString(rv) {
  		// The URL is checked against the full regexp, instead of checking
  		// individual variables. This is faster but to provide a good error
  		// message, we check individual regexps if the URL doesn't match.
  		for k, v := range r.varsN {
  			if !r.varsR[k].MatchString(values[v]) {
  				return "", fmt.Errorf(
  					"mux: variable %q doesn't match, expected %q", values[v],
  					r.varsR[k].String())
  			}
  		}
  	}
  	return rv, nil
  }
docs: // url builds a URL part using the given values.