Go Http 工作过程
Go 代码的执行流程
通过对 http 包的分析之后,现在让我们来梳理一下整个的代码执行过程。
-
首先调用 Http.HandleFunc
按顺序做了几件事:
- 调用了 DefaultServerMux 的 HandleFunc
- 调用了 DefaultServerMux 的 Handle
- 往 DefaultServeMux 的 map[string]muxEntry 中增加对应的 handler 和路由规则
-
其次调用 http.ListenAndServe(":9090", nil) 按顺序做了几件事情:
- 实例化 Server
- 调用 Server 的 ListenAndServe()
- 调用 net.Listen(“tcp”, addr) 监听端口
- 动一个 for 循环,在循环体中 Accept 请求
- 对每个请求实例化一个 Conn,并且开启一个 goroutine 为这个请求进行服务 go c.serve()
- 读取每个请求的内容 w, err := c.readRequest()
- 判断 handler 是否为空,如果没有设置 handler(这个例子就没有设置 handler),handler 就设置为
- 调用 handler 的 ServeHttp
- 在这个例子中,下面就进入到 DefaultServerMux.ServeHttp
- 根据 request 选择 handler,并且进入到这个 handler 的 ServeHTTP mux. handler(r).ServeHTTP(w, r)
- 选择 handler: A 判断是否有路由能满足这个 request(循环遍历 ServerMux 的 muxEntry) B 如果有路由满足,调用这个路由 handler 的 ServeHttp C 如果没有路由满足,调用 NotFoundHandler 的 ServeHttp
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/go/go-http-%E5%B7%A5%E4%BD%9C%E8%BF%87%E7%A8%8B/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。