code: func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
  	r.RLock()
  	defer r.RUnlock()
  
  	//wrap the response writer in our custom interface
  	w := &responseWriter{writer: rw, Router: r}
  
  	//find a matching Route
  	for _, route := range r.routes {
  
  		//if the methods don't match, skip this handler
  		//i.e if request.Method is 'PUT' Route.Method must be 'PUT'
  		if req.Method != route.method {
  			continue
  		}
  
  		//check if Route pattern matches url
  		if !route.regex.MatchString(req.URL.Path) {
  			continue
  		}
  
  		//get submatches (params)
  		matches := route.regex.FindStringSubmatch(req.URL.Path)
  
  		//double check that the Route matches the URL pattern.
  		if len(matches[0]) != len(req.URL.Path) {
  			continue
  		}
  
  		//create the http.Requests context
  		c := NewContext(req)
  
  		//add url parameters to the context
  		for i, match := range matches[1:] {
  			c.Params.Set(route.params[i], match)
  		}
  
  		//execute middleware filters
  		for _, filter := range r.filters {
  			filter(w, req)
  			if w.started { return }
  		}
  
  		//invoke the request handler
  		route.handler(w, req)
  		return
  	}
  
  	//if no matches to url, throw a not found exception
  	if w.started == false {
  		http.NotFound(w, req)
  	}
  }
docs: // Required by http.Handler interface. This method is invoked by the
  // http server and will handle all page routing