• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.参考地址

源码地址

cobra 库源码分析博客

http库简要分析博客

HTTP 协议 与 golang web 应用服务

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

此外,还有以下优点:

  • 服务函数、测试函数、错误追踪函数分离
  • 变量分类清晰
  • 命名规范

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
7天用Go动手写/从零实现分布式缓存GeeCache发布时间:2022-07-10
下一篇:
Go语言开发中MongoDB数据库发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap