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() 方法,會先執(zhí)行c.Next() 前面的,然后將控制權(quán)傳遞給下一個中間件或處理器,最后按照相反順序執(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 來中止當前中間件的后續(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 來中止當前中間件,后續(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語言中雙Token登錄系統(tǒng)的思路與實現(xiàn)詳解
在現(xiàn)代Web應(yīng)用中,身份認證是保障系統(tǒng)安全的重要環(huán)節(jié),本文將介紹如何使用Go語言實現(xiàn)雙Token登錄系統(tǒng),文中的示例代碼講解詳細,需要的可以了解下2025-07-07
Golang動態(tài)調(diào)用方法小結(jié)
本文主要介紹了Golang動態(tài)調(diào)用方法小結(jié),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式
這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Go語言開發(fā)實現(xiàn)查詢IP信息的MCP服務(wù)器
隨著?MCP?的快速普及和廣泛應(yīng)用,MCP?服務(wù)器也層出不窮,本文將詳細介紹如何在?Go?語言中使用?go-mcp?庫來開發(fā)一個查詢?IP?信息的?MCP?服務(wù)器,有需要的小伙伴可以參考下2025-04-04
Go string 字符串處理與格式化詳解從底層原理到工程實踐
這篇文章給大家介紹Go string字符串處理與格式化詳解從底層原理到工程實踐,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-05-05

