go中的http.ListenAndServe

1,154 阅读1分钟

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,简单的路由请求使用标准库足够。