如果我在 gin 中使用多个中间件,它们的执行顺序是什么

If I use multiple middleware in gin what is the order in which they are executed

如果我使用多个中间件并且我想使用 mw2 中的 mw1 输出使用 ctx.Setctx.Get 是否有任何定义的中间件执行顺序?

func main() {
    // Creates a router without any middleware by default
    r := gin.New()

    // Global middleware
    // Logger middleware will write the logs to gin.DefaultWriter even you set with GIN_MODE=release.
    // By default gin.DefaultWriter = os.Stdout
    r.Use(mw1)

    // Recovery middleware recovers from any panics and writes a 500 if there was one.
    r.Use(mw2)

    // Per route middleware, you can add as many as you desire.
    r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
}

比如上面sniped是先调用mw1,还是先调用mw2?他们的订单有保证吗?

它们按照添加到路由器的顺序执行。这就是为什么它通常被称为 中间件链.

从带有中间件参数的函数签名中可以看出,如 UseGroup 等。中间件的类型为 HandlerFunc,它们被添加到 HandlersChain,定义为:

type HandlersChain []HandlerFunc

因此您可以假设在前一个中间件中设置的上下文值将在后续中间件中可用:

func main() {
    r := gin.New()
    r.Use(func(c *gin.Context) {
        c.Set("key", "foo")
    })
    
    r.Use(func(c *gin.Context) {
        fmt.Println(c.MustGet("key").(string)) // foo 
    })
}