下面是我对studygolang路由部分的理解,不知道是否有错误,请大伙指正。这部分在我脑海里还是一堆散沙,无法结合起来。
main函数中initRouter()配置了router和subRouter两个路由。每个路由都有好几个filter,分别实现PreFilter、PreErrorHandle、PostFilter的接口。
在chain.go中的Run()。先执行PreFilter()若返回错误,将执行PreErrorHandle(),否则继续执行PostFilter()输出页面。
(输入页面方式如:view.go的PostFilter()函数中tpl.Execute(rw, data)将填充好的模版返回给用户。)
路由通过string路径注册,每个路由配置一个函数。router.HandleFunc在mux.go里面声明,所有路由统一通过NewRoute用append加进Router的routes数组中。
**问题1**:
对于下面那个函数有个疑问,注释中写的复制一份filterChan,貌似也是引用了之前的配置的filterChain,没有复制出来?
func (r *Router) NewRoute() *Route {
route := &Route{parent: r, strictSlash: r.strictSlash}
// 复制一份filterChain,否则所有的route的FilterChain会一样
if r.filterChain != nil {
var tmpChain FilterChain = *r.filterChain
route.FilterChain = &tmpChain
}
r.routes = append(r.routes, route)
return route
}
**问题2**:
我搜了下三方库和本地的代码,发现mux/filter.go中的ServeHTTP()调用了Run。然后找了下ServeHTTP(),发现mux/mux.go里和gorilla/context/context.go都有,不知道是哪个执行的?官方包这个函数介绍很模糊不知道是否官方的。
**问题3**:
router.HandleFunc注册的函数是在哪里被执行的?这个函数是应该是先于filerChain的流程的吧?
例如router.HandleFunc("/", IndexHandler)中的IndexHandler?
**问题4**:
一个游客打开网站首页,那么在程序代码中,他的整个流程是如何的呢?
麻烦Polars大哥有空耐心回答下。
更多评论
问题1:var tmpChain FilterChain = *r.filterChain,注意解引用了;
问题2:ServeHTTP() 是 net.http包中的接口 Handler 的方法,两个地方有,表示这两个地方实现了这个接口;建议根据某个请求地址跟踪一下执行流程;
问题3:这个执行需要跟踪一下 net.http包,入口当然就是 http.ListenAndServe
问题4:这个画图似乎会更好表述;
总之,理解流程,关键还是先熟悉 net.http 包的请求入口流程;这段时间有些忙,有时间整理一下 studygolang 的说明文档,以便更多人更好地参与。
#1