我已经看到很多帖子谈到在Go中构建自己的MUX,其中一个例子就在这里(http://thenewstack.io/building-a-web-server-in-go/).
什么时候应该使用默认值而不是定义自己的?Go文档和博客文章都没有说明为什么你应该使用一个而不是另一个.
Cal*_*leb 15
内置多路复用器有两个缺点:
如果您需要来自网址的信息(例如ID in /users/:id),您必须手动执行此操作:
http.HandleFunc("/users/", func(res http.ResponseWriter, req *http.Request) {
id := strings.SplitN(req.URL.Path, "/", 3)[2]
})
Run Code Online (Sandbox Code Playgroud)
哪个很麻烦.
默认服务器多路复用器不是最快的.
考虑这个基准的结论:
首先,没有理由使用net/http的默认ServeMux,这是非常有限的,并没有特别好的性能.每种口味都有足够的替代品,选择你最喜欢的.
所以真正唯一的优势就是每个人都已经拥有它,因为它已包含在内net/http.
最近我一直在朝着避免默认http.Handle和http.HandleFunc功能的方向前进,然后定义一个显式的http.Handler,然后交给它ListenAndServe.(而不是nil:
handler := http.NewServeMux()
handler.Handle("/whatever", ...)
http.ListenAndServe(80, handler)
Run Code Online (Sandbox Code Playgroud)
较新的开发人员发现区别http.Handle,http.HandleFunc微妙和混乱,所以我认为值得先了解这个http.Handler概念.多路复用器只是另一种http.Handler(将请求路由到其他http.Handlers),并且当你依赖时,现实被隐藏起来DefaultServeMux.