责任链模式通过将请求沿处理器链传递实现解耦,Go 中可用函数类型定义过滤器,构建链式调用的中间件系统,适用于认证、校验、日志等场景。

在 Go 语言中,责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链传递,每个处理者都有机会处理请求或将其传递给下一个处理者。这种模式非常适合实现过滤器系统,比如中间件、请求校验、日志记录等场景。
责任链的核心是解耦请求发送者和接收者。多个处理器按顺序组成一条链,请求从链的一端进入,依次经过各个处理器,直到某个处理器处理完毕或链结束。
在 Web 框架或 API 中间件中,这种模式非常常见:身份验证 → 参数校验 → 日志记录 → 业务逻辑,每一个环节都可以是一个独立的过滤器。
在 Go 中,我们可以用函数类型或接口来定义处理器。这里使用函数类型更简洁直观:
立即学习“go语言免费学习笔记(深入)”;
定义 Handler 类型:我们把每个过滤器定义为一个函数,接收一个 http.ResponseWriter 和 *http.Request,并返回是否继续执行后续过滤器。
也可以封装成更通用的上下文对象,但为了简单起见,先基于标准库实现。
实现 Filter 接口:创建一个 Filter 类型,表示单个过滤器:
type Filter func(http.ResponseWriter, *http.Request) bool
返回值 bool 表示是否继续向后传递请求。如果返回 false,则中断链式调用。
我们需要一个结构来管理多个过滤器,并按顺序执行它们。
定义一个 FilterChain 结构:
type FilterChain struct {
filters []Filter
}
</p>
func NewFilterChain() *FilterChain {
return &FilterChain{filters: make([]Filter, 0)}
}
</p>
func (fc *FilterChain) AddFilter(f Filter) {
fc.filters = append(fc.filters, f)
}
</p>
func (fc *FilterChain) ServeHTTP(w http.ResponseWriter, r *http.Request) {
for _, filter := range fc.filters {
if !filter(w, r) {
return // 中断链
}
}
// 所有过滤器通过后,执行最终逻辑
w.WriteHeader(http.StatusOK)
w.Write([]byte("Request processed successfully\n"))
}
现在我们添加几个典型的过滤器来演示功能:
// 身份验证过滤器
func AuthFilter() Filter {
return func(w http.ResponseWriter, r *http.Request) bool {
token := r.Header.Get("Authorization")
if token == "" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return false
}
return true
}
}
</p>
// 日志记录过滤器
func LoggingFilter() Filter {
return func(w http.ResponseWriter, r *http.Request) bool {
log.Printf("Request: %s %s from %s", r.Method, r.URL.Path, r.RemoteAddr)
return true
}
}
</p>
// 参数校验过滤器
func ValidationFilter() Filter {
return func(w http.ResponseWriter, r *http.Request) bool {
if r.ContentLength > 1024*1024 {
http.Error(w, "Payload too large", http.StatusRequestEntityTooLarge)
return false
}
return true
}
}
将过滤器链注册为 HTTP 处理程序:
func main() {
chain := NewFilterChain()
chain.AddFilter(LoggingFilter())
chain.AddFilter(AuthFilter())
chain.AddFilter(ValidationFilter())
http.Handle("/api/", chain)
log.Println("Server starting on :8080")
http.ListenAndServe(":8080", nil)
}
当请求到达 /api/xxx 时,会依次经过日志、认证、校验三个过滤器,全部通过才返回成功响应。
这种模式可以轻松扩展:
例如,在 Gin 中,你可以将每个 Filter 转换为 gin.HandlerFunc,实现类似的链式调用逻辑。
基本上就这些。Go 的函数式编程特性让责任链模式实现变得简洁高效,配合接口和组合机制,能构建出清晰、可维护的过滤器系统。
以上就是如何在Golang中实现责任链过滤器_Golang 责任链模式过滤器实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号