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