gin的中间件中使用goroutine必须使用其只读副本c.Copy()

gin默认使用Logger 和 Recovery中间件

gin.Default()默认使用了Logger 和 Recovery中间件,其中:
Logger中间件将日志写入gin.DefaultWriter,即使配置了GIN_MODE=release。
Recovery中间件会recover 任何panic。如果有panic 的话,会写入5oo 响应码。
如果不想使用上面两个默认的中间件,可以使用gin.New()新建一个没有任何默认中间件的路由。

gin中间件中使用goroutine

当在中间件或handler中启动新的goroutine时,
不能使用原始的上下文(c*gin.Context),
必须使用其只读副本c.Copy()

middlewares\baseApiTime.go

package middlewares

import (
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
)

func UserHasLoginCheck(c *gin.Context) {
	fmt.Println("中间件开始检查用户是否登录")
	c.Set("userName", "admin")
	// goroutine 必须使用其只读副本c.Copy()
	cCp := c.Copy()
	go func() {
		time.Sleep(4 * time.Second)
		fmt.Printf("完成啦,", cCp.Request.URL.Path)
	}()
}
posted @ 2026-10-24 17:34  何人陪我共长生  阅读(6)  评论(0)    收藏  举报