如何为Go中的所有请求创建通用功能?

I am writing a web application with Go to get better with it. My use case is pretty simple. I want to have a common function that will be executed for every request and will generate the navigation bar depending on the user status.

init method looks like (will also give you the idea of my implementation of handler methods):

func init() {
    initDB()
    gob.Register(user.User{})
    r := mux.NewRouter()
    r.HandleFunc("/", handleHome)
    http.Handle("/", r)
}

I am using the following method to execute templates.

func executeTemplate(w http.ResponseWriter, name string, status int, data map[string]interface{}) error {
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    w.WriteHeader(status)
    data["User"] = getUser(r)
    return tpls[name].ExecuteTemplate(w, "base", data)
}

I am using Gorilla toolkit to store the session but as of my understanding, I need the http.Request instance every time to access the cookie store. Now I don't want to change the signature of executeTemplate method. Is there any way I can add a function to generate the navigation bar without changing signature of any of the existing methods?

What are some good ways to do it (even with changing the existing methods)?

Basic common approach to create middleware in Gorillatoolkit is to wrap top-level mux. Something like

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        //You do something here using request
        h.ServeHTTP(w, r)
    })
}

And then

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