go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié)
c.netx()
測試代碼
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "net/http" ) func main() { g := gin.New() g.Use(middleware1(), middleware2()) g.GET("/", func(c *gin.Context) { fmt.Println("process request") c.JSON(http.StatusOK, "hello,world!") }) err := g.Run() if err != nil { log.Fatal(err) } } func middleware1() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware1 start") c.Next() fmt.Println("middleware1 end") } } func middleware2() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware2 start") c.Next() fmt.Println("middleware2 end") } }
訪問 http://127.0.0.1:8080 執(zhí)行結(jié)果如下,瀏覽器輸出 “hello,world!”
middleware1 start
middleware2 start
process request
middleware2 end
middleware1 end
總結(jié)
中間件的執(zhí)行順序是按照注冊的順序執(zhí)行的,在中間件中使用 c.Next() 方法,會(huì)先執(zhí)行c.Next() 前面的,然后將控制權(quán)傳遞給下一個(gè)中間件或處理器,最后按照相反順序執(zhí)行中間件c.Next() 后面的代碼。 c.abort() 測試代碼
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "net/http" ) func main() { g := gin.New() g.Use(middleware1(), middleware2(), middleware3()) g.GET("/", func(c *gin.Context) { fmt.Println("process request") c.JSON(http.StatusOK, "hello,world!") }) err := g.Run() if err != nil { log.Fatal(err) } } func middleware1() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware1 start") c.Next() fmt.Println("middleware1 end") } } func middleware2() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware2 start") c.Abort() fmt.Println("middleware2 end") } } func middleware3() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware3 start") c.Next() fmt.Println("middleware3 end") } }
訪問 http://127.0.0.1:8080 執(zhí)行結(jié)果如下,瀏覽器無輸出
middleware1 start
middleware2 start
middleware2 end
middleware1 end
總結(jié)
中間件的執(zhí)行順序是按照注冊順序執(zhí)行的,中間件可以通過 c.Abort() 來中止后續(xù)中間件或處理器的處理流程。
return 測試代碼
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "net/http" ) func main() { g := gin.New() g.Use(middleware1(), middleware2(), middleware3()) g.GET("/", func(c *gin.Context) { fmt.Println("process request") c.JSON(http.StatusOK, "hello,world!") }) err := g.Run() if err != nil { log.Fatal(err) } } func middleware1() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware1 start") c.Next() fmt.Println("middleware1 end") } } func middleware2() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware2 start") return fmt.Println("middleware2 end") } } func middleware3() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware3 start") c.Next() fmt.Println("middleware3 end") } }
訪問 http://127.0.0.1:8080 執(zhí)行結(jié)果如下,瀏覽器輸出 “hello,world!”
middleware1 start
middleware2 start
middleware3 start
process request
middleware3 end
middleware1 end
總結(jié)
中間件的執(zhí)行順序是按照注冊順序執(zhí)行的,中間件可以通過 retrurn 來中止當(dāng)前中間件的后續(xù)處理流程。
c.abort() +return 測試代碼
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "net/http" ) func main() { g := gin.New() g.Use(middleware1(), middleware2(), middleware3()) g.GET("/", func(c *gin.Context) { fmt.Println("process request") c.JSON(http.StatusOK, "hello,world!") }) err := g.Run() if err != nil { log.Fatal(err) } } func middleware1() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware1 start") c.Next() fmt.Println("middleware1 end") } } func middleware2() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware2 start") c.Abort() return fmt.Println("middleware2 end") } } func middleware3() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("middleware3 start") c.Next() fmt.Println("middleware3 end") } }
訪問 http://127.0.0.1:8080 執(zhí)行結(jié)果如下,瀏覽器無輸出
middleware1 start
middleware2 start
middleware1 end
總結(jié)
中間件的執(zhí)行順序是按照注冊順序執(zhí)行的,中間件可以通過 c.abort() + retrurn 來中止當(dāng)前中間件,后續(xù)中間件和處理器的處理流程。
到此這篇關(guān)于go gin中間件關(guān)于 c.next()、c.abort()和return的使用的文章就介紹到這了,更多相關(guān)go gin中間件c.next()、c.abort()和return內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)
這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語言小白的掃盲文,主要講解了go語言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下2022-12-12go語言中GOPATH GOROOT的作用和設(shè)置方式
這篇文章主要介紹了go語言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05GoLang中生成UUID唯一標(biāo)識(shí)的實(shí)現(xiàn)
這篇文章主要介紹了GoLang中生成UUID唯一標(biāo)識(shí)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Go|使用Options模式和建造者模式創(chuàng)建對象實(shí)戰(zhàn)
這篇文章主要介紹了Go使用Options模式和建造者模式創(chuàng)建對象實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04golang定時(shí)器Timer的用法和實(shí)現(xiàn)原理解析
這篇文章主要介紹了golang定時(shí)器Ticker,本文主要來看一下Timer的用法和實(shí)現(xiàn)原理,需要的朋友可以參考以下內(nèi)容2023-04-04