http包中serverHandler类型的分析
1 | // serverHandler delegates to either the server's Handler or |
serverHandler
是一个结构体,在结构体中,只有一个字段sv *Server
, 这里在实际运行的过程中,保存了最开始创建的Server实例,包好了服务端Ip端口信息,Handler信息等。
serverHandler
也实现了http.Handler接口,我们看一下其ServeHTTP方法的实现:
1 | handler := sh.srv.Handler |
这里是在获取Server实例中的Handler对象,也就是在调用http.ListenAndServe
函数,传入的Handler。
1 | if handler == nil { |
这里判断handler如果为空,就使用默认的handler,ServeMux。
1 | handler.ServeHTTP(rw, req) |
这里就调用handler的ServeHTTP方法了,要么进入到自定义的handler中,要么进入到ServeMux
handler中。
接下来我们,我们看一下serverHandler的使用的地方。其实serverHandler
是在接收到客户端的请求后,调用Conn的serve
方法中使用的。
1 | go c.serve(ctx) // 使用goroutines处理我们的请求 |
Conn的server方法如下:
1 | // Serve a new connection. |
从这个代码中,可以看出,serverHandler起到了承上启下的作用,由于路由到了我们自定义的handler或ServeMux Handler中, 从而路由到我们的实现的Handler函数。