1、不使用默認(rèn)的中間件
/*
@Author : 寒云
@Email : 1355081829@qq.com
@Time : 2019/10/15 11:51
*/
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
r := gin.New()
r.Use(gin.Logger())
_ = r.Run(":8089")
}
不使用默認(rèn)的中間件
r := gin.New()
添加一個(gè)中間件
r.Use(gin.Logger())
2、使用默認(rèn)的中間件
···
// Default 使用 Logger 和 Recovery 中間件
r := gin.Default()
···
3、在中間件中使用 Goroutine
/*
@Author : 寒云
@Email : 1355081829@qq.com
@Time : 2019/10/15 11:51
*/
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
r := gin.New()
r.Use(gin.Logger())
r.GET("/long_async", func(c *gin.Context) {
// 創(chuàng)建在 goroutine 中使用的副本
cCp := c.Copy()
go func() {
// 用 time.Sleep() 模擬一個(gè)長任務(wù)。
time.Sleep(5 * time.Second)
// 請注意您使用的是復(fù)制的上下文 "cCp",這一點(diǎn)很重要
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
c.JSON(http.StatusOK, gin.H{"name": "hanyun"})
})
_ = r.Run(":8089")
}
我們訪問http://127.0.0.1:8089/long_async之后結(jié)果立馬返回,我們打印的日志等待5秒后輸出
敲黑板,下面一定要記著,在攜程里使用中間件 一定 cCp := c.Copy() ,如下示例
r.GET("/long_async", func(c *gin.Context) {
// 創(chuàng)建在 goroutine 中使用的副本
cCp := c.Copy()
go func() {
// 用 time.Sleep() 模擬一個(gè)長任務(wù)。
time.Sleep(5 * time.Second)
// 請注意您使用的是復(fù)制的上下文 "cCp",這一點(diǎn)很重要
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
})