studygolang filter模块阅读小结

whispermemory · 2013-04-28 04:24:14 · 6058 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-04-28 04:24:14 的主题,其中的信息可能已经有所发展或是发生改变。

##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的方法调用需要依赖遵循协议的对象来执行协议方法。


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

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

6058 次点击  
加入收藏 微博
3 回复  |  直到 2014-03-26 09:05:36
aiden
aiden · #1 · 12年之前

HanlderFunc执行时,会自动调用ServeHTTP吗,依据的是什么原理?

whispermemory
whispermemory · #2 · 12年之前
aidenaiden #1 回复

HanlderFunc执行时,会自动调用ServeHTTP吗,依据的是什么原理?

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() }

whispermemory
whispermemory · #3 · 12年之前
aidenaiden #1 回复

HanlderFunc执行时,会自动调用ServeHTTP吗,依据的是什么原理?

2> router ServeHTTP 方法

func (r *Router) ServeHTTP(w,r) { //根据 uri 查找路由 map

// 获取 handler

// 调用 handler hanlder.ServeHTTP()

}

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