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")
}
启动服务器,输出结果如下:
2 条评论
可以说一下原因么?为啥不能使用原生上下文对象,我试了用原生访问也没有报错,想知道原因
避免污染其中的数据 它这个参数传递的 context 应该是全局的