go中的http.ListenAndServe

ListenAndServe使用指定的监听地址和处理器启动一个HTTP服务端。处理器参数通常是nil,这表示采用包变量DefaultServeMux作为处理器。Handle和HandleFunc函数可以向DefaultServeMux添加处理器, 如:


type httpServer struct {
}

func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte(r.URL.Path))  // 向响应中写入访问的路径
}

func main() {
    var server httpServer
    // Handle 方法设置访问的路由
    http.Handle("/test", server)

    // 使用HandleFunc设置访问的路由
    http.HandleFunc("/demo", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "hello word") //这个写入到w的是输出到客户端的
    })

    // 设置监听的端口
    err := http.ListenAndServe(":7070", nil)

    if err != nil {
        log.Fatal(err)
    }

}

从源码中不难发现,处理器将HandleFunc函数内部也是调用了handle的方法。handle函数接受两个参数,第一个参数我们称为模式,第二个参数叫做处理器,handle函数将处理器加入到内部定义的map,此map的key值为模式(如上面"/test""/demo")的串,值为muxEntry类型。如果模式的处理程序已经存在,则会抛出异常,muxEntry分别保存这handle传入的模式和处理器,每次http访问时会匹配对应的模式处理器。

go1.13.14\src\net\http\server.go 2435:5

    if mux.m == nil {
        mux.m = make(map[string]muxEntry)
    }
    e := muxEntry{h: handler, pattern: pattern}
    mux.m[pattern] = e

上述的模式匹配就是我们说的router功能,go标准库默认提供的router功能,router也时常被称为 http 的 multiplexer,简单的路由请求使用标准库足够。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容