何时使用Golang的默认MUX而不是自己做

jor*_*175 7 http go mux

我已经看到很多帖子谈到在Go中构建自己的MUX,其中一个例子就在这里(http://thenewstack.io/building-a-web-server-in-go/).

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

Cal*_*leb 15

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

  1. 如果您需要来自网址的信息(例如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)

    哪个很麻烦.

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

考虑这个基准的结论:

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

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

最近我一直在朝着避免默认http.Handlehttp.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.