##Filter模块与Hanlder##
Hanlder是一种已知类型的回调方法,由使用者提供,可以抽象出一个type func类型来接受这种方法
type HandlerFunc func(http.ResponseWriter, *http.Request)
然后给该方法添加一个方法用来在触发该方法的调用
func (f HandlerFunc) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// 执行当前Route的FilterChain
filterChain := CurrentRoute(req).FilterChain
if filterChain != nil {
filterChain.Run(f, rw, req)
return
}
// 没有设置FilterChain时,直接执行Handler
f(rw, req)
}
可以看出来在Route中的filterChain的调用,从
func (this *FilterChain) Run(handler HandlerFunc, rw http.ResponseWriter, req *http.Request) {
if this.cur < len(this.filters) {
i := this.cur
this.cur++
if this.filters[i].PreFilter(rw, req) {
this.Run(handler, rw, req)
this.filters[i].PostFilter(rw, req)
} else {
// 错误处理中,过滤器链不应该往下执行了。
this.cur = 0
// 执行错误处理
this.filters[i].PreErrorHandle(rw, req)
}
} else {
// 复位
this.cur = 0
handler(rw, req)
}
}
在filter执行完毕之前是不会执行hanlder的。
这个HanlderFunc类型好使,直接封装了类型,并指定回调调用时机。而且可以不用为他需要的操作生成数据类型。不像objective-c的方法调用需要依赖遵循协议的对象来执行协议方法。
2> router ServeHTTP 方法
func (r *Router) ServeHTTP(w,r) {
//根据 uri 查找路由 map
// 获取 handler
// 调用 handler hanlder.ServeHTTP()
}
#3
更多评论
1> 生成 http Router
router := initRouter()
http.Handle("/", router)
这样 http 走到 / 的时候会调用 router ServeHTTP 方法
2> router ServeHTTP 方法
func (r *Router) ServeHTTP(w,r) {
//根据 uri 查找路由 map
// 获取 handler
// 调用 handler
hanlder.ServeHTTP()
}
#2