是的,存储的就是pattern所对应的handler,在这里我们称其为路由。
那么这个相对应的是如何工作呢,这里就需要看看http.ListenAndServe("localhost:8080", serveMux)源码了。
我们来看看具体如何实现,这里的源码比较长,我们选取比较重要的几段来看看
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
这里将监听的地址和要处理的handler传入,再往下看
go c.serve(ctx)
这里用启动goroutine来服务每一个客户端的请求,最后的处理都在c.serve这个方法中,在这个方法中,有一个地方值得注意。
serverHandler{c.server}.ServeHTTP(w, w.req)
这里又调用了一个ServeHTTP方法,然后去看看这个方法处理了一些什么。
在这个方法里面我们看到有这么一段代码
if handler == nil {
handler = DefaultServeMux
}
...
handler.ServeHTTP(rw, req)
这里看到如果没有传入handler,那么就使用默认的DefaultServeMux,现在我们明白为什么在开头的第一段代码里面我们要传入一个nil,然后handler.ServeHTTP(rw, req),就是调用了接口Handler的实现方法,这样就能决定某一个pattern要去对应哪一个handler,看到这里我们大概就能明白这个服务器的大概原理是怎么样的,当然这是很表面的一个分析,还有很多深层次的东西需要研究。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。










