关于Go语言http包的源码分析

1.参考地址

源码地址

cobra 库源码分析博客

http库简要分析博客

HTTP 协议 与 golang web 应用服务

2.原理图

原理图原理图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 结构体,然后在后面的部分根据参数逻辑的不同分别实现具体函数。

此外,还有以下优点:

  • 服务函数、测试函数、错误追踪函数分离
  • 变量分类清晰
  • 命名规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值