gin中在中间件或handler中使用goroutine
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "time" ) func main() { // 当在中间件或handler启动新的goroutine时, 不能使用原始的上下文,必须使用只读的副本 r := gin.Default() r.GET("/long_async", func(context *gin.Context) { // 创建在goroutine中使用的副本 cpContext := context.Copy() go func() { time.Sleep(2 * time.Second) // 注意:使用的是复制的上下文cpContext,这一点很重要 fmt.Println(cpContext.Request.URL.Path) }() }) r.GET("/long_sync", func(context *gin.Context) { time.Sleep(2 * time.Second) // 因为没有使用goroutine,所以不需要拷贝上下文 log.Println(context.Request.URL.Path) }) r.Run() }
在中间件中使用goroutine
func main() { // 在中间件中使用goroutine时,必须使用上下文的只读副本 router := gin.Default() router.Use(func(context *gin.Context) { cpContext := context.Copy() go func() { log.Println("中间件执行了") log.Println(cpContext.Request.URL.Path) }() }) router.GET("/json", func(context *gin.Context) { context.String(200, "OK") }) router.Run() }