goweb适配器模式
goweb学习:http包中关于隐式集成接口与作用
-
代码结构解析
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
- HandlerFunc 是一个函数类型,其定义为:
type HandlerFunc func(ResponseWriter, *Request)
- ServeHTTP 是 Handler 接口中定义的方法,接口声明如下:
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
- ServeHTTP 是 Handler 接口中定义的方法,接口声明如下:
- HandlerFunc 是一个函数类型,其定义为:
-
底层逻辑
-
接口的隐式实现
Go 语言中,接口的实现是隐式的。只要一个类型实现了接口的所有方法,它就自动成为该接口的实现者。
- HandlerFunc 类型通过定义 ServeHTTP 方法,满足了 Handler 接口的要求。
- 因此,任何 HandlerFunc 类型的函数都可以被当作 Handler 接口对象使用。
-
方法调用的本质
f(w, r) 实际上是直接调用 HandlerFunc 函数自身:
// 将普通函数转换为 HandlerFunc 类型 myHandler := HandlerFunc(func(w ResponseWriter, r *Request) { fmt.Fprintf(w, "Hello") }) // 调用 ServeHTTP 方法时,实际执行的是 myHandler 函数 // 当参数 w,r传递给ServeHTTP后,实际是调用myHandler,并将参数传递给MyHandler。 myHandler.ServeHTTP(w, r)
这相当于通过 ServeHTTP 方法将函数调用委托给 HandlerFunc 自身。
-
-
HandlerFunc 的典型应用场景
-
快速注册普通函数为处理器
通过 http.HandleFunc 方法,开发者无需定义结构体即可注册路由:
func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") } // 注册路由:自动将函数转换为 HandlerFunc 类型 http.HandleFunc("/hello", helloHandler)
底层逻辑等价于
http.Handle("/hello", http.HandlerFunc(helloHandler))
-
闭包封装中间件
适配器模式常用于中间件链的构建。例如,为处理器添加日志功能:
func loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Request: %s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) }) } // 使用中间件 http.Handle("/api", loggingMiddleware(apiHandler))
-
-
设计模式对比
核心目的 典型应用场景 与 HandlerFunc 的关系 适配器模式 接口转换 整合不兼容的组件 HandlerFunc 的本质实现 装饰器模式 功能扩展 添加日志、缓存等横切关注点 中间件实现的基础 代理模式 访问控制 权限验证、延迟加载 可通过 HandlerFunc 包装实现
(图片来源网络,侵删)
(图片来源网络,侵删)
(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。