中间件管理器,用于维护中间件函数链的顺序、组合方式、执行顺序等信息,提供中间件注册、注销、调用等功能
package middleware
import (
"net/http"
)
// MiddlewareFunc 定义中间件函数类型
type MiddlewareFunc func(http.Handler) http.Handler
// MiddlewareManager 定义中间件管理器
type MiddlewareManager struct {
middlewares []MiddlewareFunc
}
// NewMiddlewareManager 创建中间件管理器
func NewMiddlewareManager() *MiddlewareManager {
return &MiddlewareManager{}
}
// Use 注册中间件函数
func (m *MiddlewareManager) Use(mw MiddlewareFunc) {
m.middlewares = append(m.middlewares, mw)
}
// Remove 删除中间件函数
func (m *MiddlewareManager) Remove(mw MiddlewareFunc) {
for i, v := range m.middlewares {
if v == mw {
m.middlewares = append(m.middlewares[:i], m.middlewares[i+1:]...)
return
}
}
}
// Apply 应用中间件处理器,返回最终处理HTTP请求的函数
func (m *MiddlewareManager) Apply(h http.Handler) http.Handler {
for i := len(m.middlewares) - 1; i >= 0; i-- {
h = m.middlewares[i](h)
}
return h
}
该示例定义了MiddlewareFunc
类型和MiddlewareManager
结构体,其中MiddlewareManager
结构体维护了一个middlewares
切片,用于存储中间件函数链。NewMiddlewareManager
函数用于创建一个新的中间件管理器实例,Use
函数用于向中间件管理器中注册一个中间件函数,Remove
函数用于从中间件管理器中注销一个中间件函数,Apply
函数用于将中间件函数链应用到最终的HTTP请求处理器中,生成最终处理HTTP请求的函数。
package main
import (
"log"
"net/http"
)
func main() {
// 创建中间件管理器
mgr := middleware.NewMiddlewareManager()
// 注册中间件函数
mgr.Use(func(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("Middleware 1 before")
h.ServeHTTP(w, r)
log.Println("Middleware 1 after")
})
})
mgr.Use(func(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("Middleware 2 before")
h.ServeHTTP(w, r)
log.Println("Middleware 2 after")
})
})
// 创建最终处理HTTP请求的函数
finalHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("Final Handler")
w.Write([]byte("Hello, World!"))
})
// 应用中间件处理器
handler := mgr.Apply(finalHandler)
// 启动HTTP服务器
log.Println("Listening on :8080...")
http.ListenAndServe(":8080", handler)
}