以下是零碎的资料与分析

    资料
    标准库文档
    版本:1.15.6

    关于标准库实现的简单的的功能,一个是web路由解析;一个是启动服务即listen port

    1. http.Handle("/foo", fooHandler)
    2. http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    3. fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
    4. })
    5. log.Fatal(http.ListenAndServe(":8080", nil))

    如何启动一个web服务:
    在源码server.go line:3118

    1. func ListenAndServe(addr string, handler Handler) error {
    2. server := &Server{Addr: addr, Handler: handler}
    3. return server.ListenAndServe()
    4. }

    可以看出 真正让web 服务run起来的是结构体 Server。不出意外,Server 应该实现了ListenAndServe接口:

    1. func (srv *Server) ListenAndServe() error {
    2. if srv.shuttingDown() {
    3. return ErrServerClosed
    4. }
    5. addr := srv.Addr
    6. if addr == "" {
    7. addr = ":http"
    8. }
    9. ln, err := net.Listen("tcp", addr)
    10. if err != nil {
    11. return err
    12. }
    13. return srv.Serve(ln)
    14. }

    再来看http 的路由处理(只看HandleFunc):
    从http.HandleFunc -》
    DefaultServeMux.HandleFunc(pattern, handler)-》
    ServeMux.Handle(pattern, HandlerFunc(handler)) ->

    通过ServerMux 和 muxEntry保存路由和handle 的映射关系

    1. e := muxEntry{h: handler, pattern: pattern}
    2. mux.m[pattern] = e

    真正能力的是ServeHTTP

    1. type Handler interface {
    2. ServeHTTP(ResponseWriter, *Request)
    3. }

    那么按照第一步,围绕这两点去实现框架