中间件执行流程

I cannot grasp the execution flow of this code:

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

Output:

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

Why does it print middlewareTwo again before middlewareOne again?

Let make the stack a tree, it's easier to understand:

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

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

    return middleware one

middlewareOne again()
...

In order for middleware one to complete and move to middleware one again it needs the middleware two to return, as middleware two includes middleware two again, it needs to run middleware two again before completing.