中間件

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)
        }()
    })

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容