中间件,对以后的路由全部生效。
设置好中间件以后,所有的路由都会使用这个中间件。
设置以前的路由,不生效。
gin 框架规定:中间件类型为:gin.HandlerFunc 类型。
gin.HandlerFunc 类型。就是 :
- func (c *gin.Context) {
-
- }
- // 示例:
- func Logger() gin.HandlerFunc {
- return func (c *gin.Context) {
- }
- }
- r.Use(Logger()) // 传 “中间件” 做参数。
- // 创建第一种中间件
-
- func CreateMid1(ctx *gin.Context) { //Test1 的类型就是Test2的返回类型
- fmt.Println("创建第一种中间件")
- fmt.Println("再创建第一种中间件")
- }
-
- // 创建第二种中间件/另一种格式的中间件
-
- func CreateMid2() gin.HandlerFunc {
- return func(context *gin.Context) {
- fmt.Println("创建第二种中间件")
- fmt.Println("再创建第二种中间件")
- }
- }
-
-
-
- func Test() {
- router := gin.Default()
-
- // 使用中间件
- router.Use(CreateMid1) //注意两种调用方式
- router.Use(CreateMid2())
-
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })
-
- router.Run(":9999")
- }
表示,跳过当前中间件剩余内容, 去执行下一个中间件。 当所有操作执行完之后,以出栈的执行顺序返回,执行剩余代码。
- // 测试next()
-
- func CreateMid1_next(ctx *gin.Context) { //Test1 的类型就是Test2的返回类型
- fmt.Println("创建第一种中间件")
- ctx.Next() //跳过当前中间件剩余内容, 去执行下一个中间件。 当所有操作执行完之后,以出栈的执行顺序返回,执行剩余代码。
- fmt.Println("再创建第一种中间件")
- }
-
- func CreateMid2_next() gin.HandlerFunc {
- return func(context *gin.Context) {
- fmt.Println("创建第二种中间件")
- context.Next()
- fmt.Println("再创建第二种中间件")
- }
- }
-
- func TestNext() {
- router := gin.Default()
-
- // 使用中间件
- router.Use(CreateMid1_next) //注意两种调用方式
- router.Use(CreateMid2_next())
-
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })
-
- router.Run(":9999")
- }
终止执行当前中间件剩余内容,执行下一个中间件。 当所有的函数执行结束后,以出栈的顺序执行返回,但,不执行return后的代码!
- func CreateMid1_next(ctx *gin.Context) { //Test1 的类型就是Test2的返回类型
- fmt.Println("创建第一种中间件")
- ctx.Next() //跳过当前中间件剩余内容, 去执行下一个中间件。 当所有操作执行完之后,以出栈的执行顺序返回,执行剩余代码。
- fmt.Println("再创建第一种中间件")
- }
-
- // 测试return
-
- func CreateMid2_return() gin.HandlerFunc {
- return func(context *gin.Context) {
- fmt.Println("创建第二种中间件")
- return // return // 终止执行当前中间件的剩余内容,执行下一个中间件的内容
- context.Next()
- fmt.Println("再创建第二种中间件")
- }
- }
-
- func TestReturn() {
- router := gin.Default()
-
- // 使用中间件
- router.Use(CreateMid1_next) //注意两种调用方式
- router.Use(CreateMid2_return())
-
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })
-
- router.Run(":9999")
- }
只执行当前中间件, 操作完成后,以出栈的顺序,依次返回上一级中间件。
- func CreateMid1_next(ctx *gin.Context) { //Test1 的类型就是Test2的返回类型
- fmt.Println("创建第一种中间件")
- ctx.Next() //跳过当前中间件剩余内容, 去执行下一个中间件。 当所有操作执行完之后,以出栈的执行顺序返回,执行剩余代码。
- fmt.Println("再创建第一种中间件")
- }
-
- // 测试Abort
-
- func CreateMid2_Abort() gin.HandlerFunc {
- return func(context *gin.Context) {
- fmt.Println("创建第二种中间件")
- context.Abort() // 只执行当前中间件,操作完成后,执行上一个中间件
- fmt.Println("再创建第二种中间件")
- }
- }
-
-
- func TestAbort() {
- router := gin.Default()
-
- // 使用中间件
- router.Use(CreateMid1_next) //注意两种调用方式
- router.Use(CreateMid2_Abort())
-
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })
-
- router.Run(":9999")
- }
-
- // 测试业务时间
-
- func TestTime() {
- router := gin.Default()
-
- // 使用中间件
-
- // 测试第一种 6.902µs
- router.Use(CreateMid1_Time) //注意两种调用方式
- router.Use(CreateMid2_next())
-
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })
-
- /* // 测试第二种 1.708µs
- router.Use(CreateMid1_Time) //注意两种调用方式
- router.Use(CreateMid2_Abort())
- router.GET("/test", func(context *gin.Context) {
- fmt.Println("使用中间件")
- context.Writer.WriteString("hello world!")
- })*/
-
- router.Run(":9999")
- }
2种 书写格式:(见 前面笔记)
3个 操作函数/关键字: Next()、return、Abort()
作用域:作用域 以下 的路由。( 对以上的 路由 无效!)
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!