在Go中基于接收器类型改变功能行为

时间:2014-11-03 18:25:44

标签: inheritance go

我希望函数的行为能够根据接收器进行更改。或者真的,我想要一种方法能够接收不同的接收器作为输入。例如

type handler func(http.ResponseWriter, *http.Request, *Context)
type requireloggedinhandler handler

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  ctx := setupContext(...)
  // NEXT LINE IS THE KEY LINE
  if (reflect.TypeOf(h) == main.requireloggedinhandler) {
     if !checkedLoggedIn(ctx) {
         http.Redirect(...)
         return
     }
  }

  h(w, r, ctx)
}

但问题是,一旦我们到达ServeHTTP,类型必须是处理程序,而不是requireloggedinhandler。例如,这将不起作用

r.HandleFunc("/", requireloggedinhandler(MyFunc).ServeHTTP)

我可以输入ServeHTTP作为处理程序的继承接口吗?

1 个答案:

答案 0 :(得分:3)

请勿使用r.HandleFunc直接使用r.Handle("/", MyFunc)