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