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

use*_*860 7 go go-gin

如果我使用多个中间件并且我想使用mw1in mw2using的输出ctx.Set,并且ctx.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)
}
Run Code Online (Sandbox Code Playgroud)

例如上面的 sniped 是mw1首先被调用的,还是mw2?他们的订购有保证吗?

bla*_*een 13

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

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

type HandlersChain []HandlerFunc
Run Code Online (Sandbox Code Playgroud)

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

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 
    })
}
Run Code Online (Sandbox Code Playgroud)