Middleware personalizado gorila mux

Estou usando o gorila mux para gerenciar o roteamento. O que estou sentindo falta é integrar um middleware entre todas as solicitações.

Por exemplo

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)
    }
}

Toda solicitação de entrada deve passar pelo middleware. Como posso integrar aqui um midleware?

Atualizar

Vou usá-lo em combinação com gorilas / sessões, e eles dizem:

Nota importante: Se você não estiver usando gorila / mux, precisará envolver seus manipuladores com context.ClearHandler, caso contrário você perderá memória! Uma maneira fácil de fazer isso é agrupar o mux de nível superior ao chamar http.ListenAndServe:

Como posso evitar esse cenário?

questionAnswers(4)

yourAnswerToTheQuestion