7

次の init 関数ルーティング リクエストがあるとします。

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 があなたに望んでいることでもありますか?

4

1 に答える 1

10

2 つのオプションがあります。

  1. http.Handlerインターフェイスを実装できます
  2. http.HandlerFuncラッパーHandleFuncですべてをラップします。

シンプルなものが欲しいように見えるので、WRapperを説明します

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)
}
于 2013-05-09T17:59:46.960 に答える