作家
登录

Go语言HTTP Server源码分析

作者: 来源: 2017-04-10 15:04:23 阅读 我要评论

if mux.m == nil { mux.m = make(map[string]muxEntry) } //把handler和pattern模式绑定到 //map[string]muxEntry的map上 mux.m[pattern] = muxEntry{explicit: true, h: handler, pattern: pattern} if pattern[0] != '/' { mux.hosts = true } //这里是绑定静态目次,不作为本片重点。 n := len(pattern) if n > 0 && pattern[n-1] == '/' && !mux.m[pattern[0:n-1]].explicit { path := pattern if pattern[0] != '/' { path = pattern[strings.Index(pattern, "/"):] } url := &url.URL{Path: path} mux.m[pattern[0:n-1]] = muxEntry{h: RedirectHandler(url.String(), StatusMovedPermanently), pattern: pattern} }}

①路由注册

膳绫擎的流程就完成了路由注册。

②办事监听

type Server struct {    Addr         string            Handler      Handler           ReadTimeout  time.Duration     WriteTimeout time.Duration     TLSConfig    *tls.Config       MaxHeaderBytes int    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)    ConnState func(net.Conn, ConnState)    ErrorLog *log.Logger    disableKeepAlives int32        nextProtoOnce     sync.Once     nextProtoErr      error     }func ListenAndServe(addr string, handler Handler) error {    server := &Server{Addr: addr, Handler: handler}    return server.ListenAndServe()}//初始化监听地址Addr,同时调用Listen办法设置监听。//最后将监听的TCP对象传入Serve办法:func (srv *Server) ListenAndServe() error {        addr := srv.Addr        if addr == "" {            addr = ":http"        }        ln, err := net.Listen("tcp", addr)        if err != nil {            return err        }        return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})    }

Serve(l net.Listener)为每个请求开启goroutine的设计,包管了go的高并发。

func (srv *Server) Serve(l net.Listener) error {    defer l.Close()    if	
				
			

  推荐阅读

  Linux命令行工具使用小贴士及技巧(三)

在这个系列的第一部分,我们具体地评论辩论了 cd - 敕令,在第二部分,我们深刻商量了 pushd 和 popd 两个敕令,以及它们应用的场景。持续对敕令行的评论辩论,在这篇教程中,我们将会经由>>>详细阅读


本文标题:Go语言HTTP Server源码分析

地址:http://www.17bianji.com/lsqh/34685.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)