Gin 使用示例(十三):中间件中使用协程的注意事项


在中间件或处理器中开启新的协程时,不应该在其中使用原生的上下文对象,而应该使用它的只读副本:

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

  r.GET("/long_async", func(c *gin.Context) {
    // 在协程中使用上下文对象c的只读副本
    cCp := c.Copy()
    go func() {
      // 通过 time.Sleep() 模拟耗时任务
      time.Sleep(5 * time.Second)

      // ⚠️ 注意这里使用的是上下文对象的只读副本 "cCp"
      log.Println("Done! in path " + cCp.Request.URL.Path)
    }()
  })

  r.GET("/long_sync", func(c *gin.Context) {
    // 通过 time.Sleep() 模拟耗时任务
    time.Sleep(5 * time.Second)

    // 这里没有使用协程,所以可以直接使用上下文对象 c
    log.Println("Done! in path " + c.Request.URL.Path)
  })

  r.Run(":8080")
}

启动服务器,输出结果如下:

-w906


点赞 取消点赞 收藏 取消收藏

<< 上一篇: Gin 使用示例(十二):定义路由日志格式

>> 下一篇: Gin 使用示例(十四):路由分组