如何为 Go 中的所有请求创建一个通用函数?
How to create a common function for all requests in Go?
我正在用 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 方法的签名。有什么方法可以添加一个函数来生成导航栏而不更改任何现有方法的签名?
有哪些好的方法(即使改变现有方法)?
在 Gorillatoolkit 中创建中间件的基本常用方法是包装顶级 mux。像
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))
我正在用 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 方法的签名。有什么方法可以添加一个函数来生成导航栏而不更改任何现有方法的签名?
有哪些好的方法(即使改变现有方法)?
在 Gorillatoolkit 中创建中间件的基本常用方法是包装顶级 mux。像
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))