当前位置: > > > > 如果我在 gin 中使用多个中间件,它们的执行顺序是什么
来源:stackoverflow
2024-04-20 18:21:35
0浏览
收藏
目前上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《如果我在 gin 中使用多个中间件,它们的执行顺序是什么》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~
问题内容
如果我使用多个中间件,并且我想使用 ctx.set
和 ctx.get
在 mw2
中使用 mw1
的输出,中间件的执行顺序是否有任何定义的顺序?
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) }
例如,在上面的狙击中,首先调用的是 mw1
,还是 mw2
?他们的订购有保证吗?
正确答案
它们按照添加到路由器的顺序执行。这就是为什么它通常被称为中间件链。
从采用中间件参数的函数签名中可以看到,如 use
、group
等。中间件的类型为 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 }) }
好了,本文到此结束,带大家了解了《如果我在 gin 中使用多个中间件,它们的执行顺序是什么》,希望本文对你有所帮助!关注公众号,给大家分享更多Golang知识!