Goroutines dentro de un middleware

Cuando se inicia una goroutine dentro de un middleware o un handler, NO SE DEBE utilizar el context dentro de él, debe emplearse una copia de lectura.

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

	r.GET("/long_async", func(c *gin.Context) {
		// crear una copia para usar dentro de la rutina
		cCp := c.Copy()
		go func() {
			// se simula una tarea prolongada con un time.Sleep(). de 5 seconds
			time.Sleep(5 * time.Second)

			// IMPORTANTE: nótese que se trabaja con la copia del contexto "cCp"
			log.Println("Done! in path " + cCp.Request.URL.Path)
		}()
	})

	r.GET("/long_sync", func(c *gin.Context) {
		// se simula una tarea prolongada con un time.Sleep(). de 5 seconds
		time.Sleep(5 * time.Second)

		// debido a que NO se está usando una goroutine, no necesitamos una copia del context
		log.Println("Done! in path " + c.Request.URL.Path)
	})

	// Escucha y sirve peticiones en 0.0.0.0:8080
	r.Run(":8080")
}