以下是零碎的资料与分析
关于标准库实现的简单的的功能,一个是web路由解析;一个是启动服务即listen port
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
如何启动一个web服务:
在源码server.go line:3118
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
可以看出 真正让web 服务run起来的是结构体 Server。不出意外,Server 应该实现了ListenAndServe接口:
func (srv *Server) ListenAndServe() error {
if srv.shuttingDown() {
return ErrServerClosed
}
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
再来看http 的路由处理(只看HandleFunc):
从http.HandleFunc -》
DefaultServeMux.HandleFunc(pattern, handler)-》
ServeMux.Handle(pattern, HandlerFunc(handler)) ->
通过ServerMux 和 muxEntry保存路由和handle 的映射关系
e := muxEntry{h: handler, pattern: pattern}
mux.m[pattern] = e
真正能力的是ServeHTTP
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
那么按照第一步,围绕这两点去实现框架