gin.Context的一个坑

在协程里使用gin的context时,应该先复制一份出来

Goroutines inside a middleware
When starting new Goroutines inside a middleware or handler, you SHOULD NOT use the original context inside it, you have to use a read-only copy.

func main() {
r := gin.Default()

r.GET("/long_async", func(c *gin.Context) {
	// create copy to be used inside the goroutine
	cCp := c.Copy()
	go func() {
		// simulate a long task with time.Sleep(). 5 seconds
		time.Sleep(5 * time.Second)

		// note that you are using the copied context "cCp", IMPORTANT
		log.Println("Done! in path " + cCp.Request.URL.Path)
	}()
})

r.GET("/long_sync", func(c *gin.Context) {
	// simulate a long task with time.Sleep(). 5 seconds
	time.Sleep(5 * time.Second)

	// since we are NOT using a goroutine, we do not have to copy the context
	log.Println("Done! in path " + c.Request.URL.Path)
})

// Listen and serve on 0.0.0.0:8080
r.Run(":8080")

}

你可能感兴趣的:(编程日记)