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
循环一样。在父母再次执行之前,他们每个人都需要芬兰语。