Go 中间件执行流程

Go 中间件执行流程,go,Go,我无法掌握此代码的执行流程: func middlewareOne(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("Executing middlewareOne") next.ServeHTTP(w, r) log.Println("Executing

我无法掌握此代码的执行流程:

func middlewareOne(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println("Executing middlewareOne")
        next.ServeHTTP(w, r)
        log.Println("Executing middlewareOne again")
        next.ServeHTTP(w, r)
        log.Println("Executing middlewareOne yupiii")
    })
}

func middlewareTwo(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println("Executing middlewareTwo")
        next.ServeHTTP(w, r)
        log.Println("Executing middlewareTwo again")
        next.ServeHTTP(w, r)
    })
}

func final(w http.ResponseWriter, r *http.Request) {
    log.Println("Executing finalHandler")
    w.Write([]byte("OK"))
}

func main() {
    finalHandler := http.HandlerFunc(final)
    http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
    http.ListenAndServe(":3000", nil)
}
输出:

2019/03/25 09:16:32 Executing middlewareOne
2019/03/25 09:16:32 Executing middlewareTwo
2019/03/25 09:16:32 Executing finalHandler
2019/03/25 09:16:32 Executing middlewareTwo again
2019/03/25 09:16:32 Executing finalHandler
2019/03/25 09:16:32 Executing middlewareOne again
2019/03/25 09:16:32 Executing middlewareTwo
2019/03/25 09:16:32 Executing finalHandler
2019/03/25 09:16:32 Executing middlewareTwo again
2019/03/25 09:16:32 Executing finalHandler
2019/03/25 09:16:32 Executing middlewareOne yupiii

为什么要在
middleware之前再次打印
middleware

让堆栈成为一棵树,更容易理解:

middlewareOne()
    middlewareTwo()
        finalHandler()
            return finalHandler
        return middlewareTwo

    middlewareTwo again()
        finalHandler()
             return finalHandler()
        return middlewareTwo again

    return middleware one

middlewareOne again()
...

为了使
中间件1
完成并再次移动到
中间件1
它需要
中间件2
返回,因为
中间件2
再次包括
中间件2
,它需要在完成之前再次运行
中间件2

让堆栈成为一棵树,更容易理解:

middlewareOne()
    middlewareTwo()
        finalHandler()
            return finalHandler
        return middlewareTwo

    middlewareTwo again()
        finalHandler()
             return finalHandler()
        return middlewareTwo again

    return middleware one

middlewareOne again()
...

为了完成
中间件一
并再次移动到
中间件二
它需要
中间件二
返回,因为
中间件二
再次包括
中间件二
,它需要在完成之前再次运行
中间件二

我不知道您试图实现什么。但之所以会发生这种情况,是因为这种中间件的运行方式就像三个嵌套的
for
循环一样。在父母再次执行之前,他们每个人都需要芬兰语。我不知道你想达到什么目的。但之所以会发生这种情况,是因为这种中间件的运行方式就像三个嵌套的
for
循环一样。在父母再次执行之前,他们每个人都需要芬兰语。