关于Go语言http包的源码分析
1.参考地址
2.原理图
3.关键功能实现
按照先后顺序:
①调用Http.HandleFunc
具体顺序
调用DefaultServerMux.HandleFunc -> 调用DefaultServerMux.Handle ->DefaultServerMux配置路由规则
源码
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
mux.Handle(pattern, HandlerFunc(handler))
}
②调用http.ListenAndServe
具体顺序
新建Server-> 调用Server.ListenAndServe -> 侦听TCP网络地址SRV.ADDR->调用Server来处理传入连接上的请求->接受连接被配置为使TCP保持别名。
例子:
helloHandler := func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, world!\n")
}
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
源码:
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
4.设计技巧
-
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
**作用:**在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
**例子:**HandleFunc函数通过调用DefaultServeMux.HandleFunc函数来实现,Server类可以认为是DefaultServeMux的一个代理类。
-
桥接模式:将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
作用: 桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
**例子:**server里抽象化了 ResponseWriter、Handler 、Flusher等接口,然后实现接口并组合,把这种多角度分类分离出来使其独立变化,减少耦合。
-
模板模式:定义一个操作中的算法的骨架,而将一些具体步骤延迟到子类中。
**作用:**模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
**例子:**在Server里定义 Hijacker 结构体,然后在后面的部分根据参数逻辑的不同分别实现具体函数。
此外,还有以下优点:
- 服务函数、测试函数、错误追踪函数分离
- 变量分类清晰
- 命名规范