如何为Go中的所有请求创建公共函数?

时间:2015-10-10 11:15:17

标签: go session-variables

我正在编写一个带有Go的Web应用程序,以便更好地使用它。我的用例非常简单。我希望有一个将为每个请求执行的常用功能,并根据用户状态生成导航栏。

init方法看起来像(也会让你了解我执行处理程序方法):

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

我使用以下方法执行模板。

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

我正在使用Gorilla工具包来存储会话但是根据我的理解,我每次都需要http.Request实例来访问cookie存储。现在我不想改变executeTemplate方法的签名。有没有什么方法可以添加一个函数来生成导航栏而不改变任何现有方法的签名?

有哪些好办法(即使改变现有方法)?

1 个答案:

答案 0 :(得分:3)

在Gorillatoolkit中创建中间件的基本常用方法是包装顶级多路复用器。像

这样的东西
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)
    })
}

然后

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