小弟阅读studygolang关于路由的流程遇到的问题

xuzhiping7 · 2013-07-06 18:31:29 · 4755 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-07-06 18:31:29 的主题,其中的信息可能已经有所发展或是发生改变。

下面是我对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大哥有空耐心回答下。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4755 次点击  
加入收藏 微博
2 回复  |  直到 2013-07-19 15:23:31
polaris
polaris · #1 · 12年之前

问题1:var tmpChain FilterChain = *r.filterChain,注意解引用了;

问题2:ServeHTTP() 是 net.http包中的接口 Handler 的方法,两个地方有,表示这两个地方实现了这个接口;建议根据某个请求地址跟踪一下执行流程;

问题3:这个执行需要跟踪一下 net.http包,入口当然就是 http.ListenAndServe

问题4:这个画图似乎会更好表述;

总之,理解流程,关键还是先熟悉 net.http 包的请求入口流程;这段时间有些忙,有时间整理一下 studygolang 的说明文档,以便更多人更好地参与。

xuzhiping7
xuzhiping7 · #2 · 12年之前

THX~~~

虽然先后顺序还是有点模糊,但我想过一段时间自然会理解的了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传