Rotinas de Go dentro dum Intermediário

Quando começares novas rotinas de Go dentro dum intermediário ou manipulador, NÃO DEVERIAS usar o contexto original dentro dele, tens que usar uma cópia de apenas leitura.

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

	r.GET("/long_async", func(c *gin.Context) {
		// criar cópia a ser usada dentro da rotina de go
		cCp := c.Copy()
		go func() {
			// simular uma tarefa longa com time.Sleep(). 5 segundos
			time.Sleep(5 * time.Second)

			// nota que estás a usar o contexto copiado "cCp", IMPORTANTE
			log.Println("Done! in path " + cCp.Request.URL.Path)
		}()
	})

	r.GET("/long_sync", func(c *gin.Context) {
		// simular uma tarefa longa com time.Sleep(). 5 segundos
		time.Sleep(5 * time.Second)

		// já que não estamos a usar uma rotina de Go, não temos que copiar o contexto
		log.Println("Done! in path " + c.Request.URL.Path)
	})

	// ouvir e servir na porta 0.0.0.0:8080
	r.Run(":8080")
}