13

我看过很多关于在 Go 中构建自己的 MUX 的帖子,这里是众多示例之一(http://thenewstack.io/building-a-web-server-in-go/)。

什么时候应该使用默认值而不是定义自己的值?Go 文档和博客文章都没有说明为什么应该使用其中一个。

4

1 回答 1

27

内置多路复用器有两个缺点:

  1. 如果您需要来自 url 的信息(例如 id in /users/:id),您必须手动完成:

    http.HandleFunc("/users/", func(res http.ResponseWriter, req *http.Request) {
        id := strings.SplitN(req.URL.Path, "/", 3)[2]
    })
    

    这很麻烦。

  2. 默认服务器多路复用器不是最快的。

考虑这个基准的结论:

首先,没有理由使用net/http默认的ServeMux,非常有限,没有特别好的性能。每种口味都有足够的替代品,选择你最喜欢的。

所以它唯一的优点是每个人都已经拥有它,因为它包含在net/http.

最近我一直在朝着避免默认http.Handlehttp.HandleFunc函数的方向发展,http.Handler而是定义一个显式,然后将其交给ListenAndServe. (而不是nil

handler := http.NewServeMux()
handler.Handle("/whatever", ...)
http.ListenAndServe(80, handler)

新开发人员发现两者之间的区别是微妙的http.Handlehttp.HandleFunc令人困惑的,所以我认为值得预先理解这个http.Handler概念。多路复用器只是另一种http.Handler(将请求路由到其他http.Handler),当您依赖DefaultServeMux.

于 2015-05-05T21:53:43.183 回答