方式1
package main
import (
"fmt"
"net/http"
)
type MiddlewareFunc func(http.HandlerFunc) http.HandlerFunc
func LoggerMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
fmt.Println("Logging:", req.Method, req.URL.Path)
next(w, req)
}
}
func LoggerMiddleware2(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
fmt.Println("Logging2:", req.Method, req.URL.Path)
next(w, req)
}
}
func UseMiddleware(handler http.HandlerFunc, middleware ...MiddlewareFunc) http.HandlerFunc {
for i := len(middleware) - 1; i >= 0; i-- {
handler = middleware[i](handler)
}
return handler
}
func myHandler(w http.ResponseWriter, req *http.Request) {
fmt.Println("do handler")
w.Write([]byte("Hello, World!"))
}
func main() {
handlerWithMiddleware := UseMiddleware(myHandler, LoggerMiddleware, LoggerMiddleware2)
http.HandleFunc("/", handlerWithMiddleware)
fmt.Println("Server is running on localhost:8080")
http.ListenAndServe(":8080", nil)
}
方式2 推荐
package main
import (
"fmt"
"math"
)
const abortIndex = math.MaxInt8 / 2
type Context struct {
Handlers []func(c *Context)
index int8
}
func (this *Context) Use(f func(c *Context)) {
this.Handlers = append(this.Handlers, f)
}
func (this *Context) Next() {
if this.index < int8(len(this.Handlers)) {
this.index++
this.Handlers[this.index](this)
}
}
func (this *Context) Run() {
this.Handlers[0](this)
}
func (this *Context) GET(path string, f func(c *Context)) {
this.Handlers = append(this.Handlers, f)
}
func (this *Context) Abort() {
this.index = abortIndex
}
func main() {
c := &Context{}
c.Use(MiddlewareOne())
c.Use(MiddlewareTwo())
c.GET("/get", func(c *Context) {
fmt.Println("执行具体方法")
})
c.Run()
}
func MiddlewareOne() func(c *Context) {
return func(c *Context) {
fmt.Println("MiddlerOne Start")
c.Next()
fmt.Println("MiddlerOne End")
}
}
func MiddlewareTwo() func(c *Context) {
return func(c *Context) {
fmt.Println("MiddlerTwo Start")
c.Next()
fmt.Println("MiddlerTwo End")
}
}
func MiddlewareThree() func(c *Context) {
return func(c *Context) {
fmt.Println("MiddlerThree Start")
c.Next()
fmt.Println("MiddlerThree End")
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!