2013-05-09 77 views
7

假设我有以下init函数路由请求。Appengine与Go:是否有一个http.Handle prehook或类似的东西?

func init() { 
    http.HandleFunc("/user", handler1) 
    http.HandleFunc("/user/profile", handler2) 
    http.HandleFunc("/user/post", handler3) 
    .... 
    .... 
} 

所有这些都需要我有用户的配置文件。

我知道我可以

func handler1(w http.ResponseWriter, r *http.Request) { 
    getUserdata() 
    //Actual handler code 
    ... 
    ... 
} 

但是,有没有办法,我可以得到的数据,而无需把函数调用每个处理程序?这就是Go最初希望你做的事情吗?

回答

9

你有两种选择。

  1. 可以inplement的http.Handler接口
  2. 你包你所有的http.HandlerFunc用包装材料HandleFunc。

因为它看起来像你想简单的东西,我会说明包装

func Prehook(f http.HandlerFunc) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
    getUserData() 
    f(w, r) 
    } 
} 

func init() { 
    // use getUserData() call before your handler 
    http.HandleFunc("/user", Prehook(handler1)) 
    // Don't use getUserData call before your handler 
    http.HandleFunc("/user/profile", handler2) 
} 
+0

这看起来完全像我所需要的。我甚至考虑包装功能,但已经感到沮丧,并且无法做到。 非常感谢! – 2013-05-09 18:10:42

+0

如果实施选项1,它会如何? – Ralf 2014-02-22 17:08:05

相关问题