• 在中间件中使用 Goroutine

    在中间件中使用 Goroutine

    当在中间件或 handler 中启动新的 Goroutine 时,不能使用原始的上下文,必须使用只读副本。

    1. func main() {
    2. r := gin.Default()
    3. r.GET("/long_async", func(c *gin.Context) {
    4. // 创建在 goroutine 中使用的副本
    5. cCp := c.Copy()
    6. go func() {
    7. // 用 time.Sleep() 模拟一个长任务。
    8. time.Sleep(5 * time.Second)
    9. // 请注意您使用的是复制的上下文 "cCp",这一点很重要
    10. log.Println("Done! in path " + cCp.Request.URL.Path)
    11. }()
    12. })
    13. r.GET("/long_sync", func(c *gin.Context) {
    14. // 用 time.Sleep() 模拟一个长任务。
    15. time.Sleep(5 * time.Second)
    16. // 因为没有使用 goroutine,不需要拷贝上下文
    17. log.Println("Done! in path " + c.Request.URL.Path)
    18. })
    19. // 监听并在 0.0.0.0:8080 上启动服务
    20. r.Run(":8080")
    21. }