Gorilla mux middleware personalizado

Estoy usando gorilla mux para administrar el enrutamiento. Lo que me falta es integrar un middleware entre cada solicitud.

Por ejemplo

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "strconv"
)

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func main() {

    port := 3000
    portstring := strconv.Itoa(port)

    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", r)

    log.Print("Listening on port " + portstring + " ... ")
    err := http.ListenAndServe(":"+portstring, nil)
    if err != nil {
        log.Fatal("ListenAndServe error: ", err)
    }
}

Cada solicitud entrante debe pasar por el middleware. ¿Cómo puedo integrar aquí un midleware?

Actualizar

Lo usaré en combinación con gorila / sesiones, y dicen:

Nota importante: si no está usando gorilla / mux, debe envolver sus manejadores con contexto. ¡Limpie el manejador ya que de lo contrario perderá memoria! Una manera fácil de hacer esto es envolver el mux de nivel superior al llamar a http.ListenAndServe:

¿Cómo puedo prevenir este escenario?

Respuestas a la pregunta(4)

Su respuesta a la pregunta