以下是零碎的资料与分析
关于标准库实现的简单的的功能,一个是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.Addrif 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)}
那么按照第一步,围绕这两点去实现框架
