Http 何时使用Golang';s默认多路复用器与您自己做

Http 何时使用Golang';s默认多路复用器与您自己做,http,go,mux,Http,Go,Mux,我看到很多帖子都在谈论如何在Go中构建自己的MUX,其中一个例子就是这里() 什么时候应该使用默认值,而不是定义自己的?Go文档和博客文章都没有说明为什么应该使用一个而不是另一个。内置mux有两个缺点: 如果您需要url中的信息(例如/users/:id)您必须手动执行: http.HandleFunc("/users/", func(res http.ResponseWriter, req *http.Request) { id := strings.SplitN(req.URL.Pa

我看到很多帖子都在谈论如何在Go中构建自己的MUX,其中一个例子就是这里()


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

内置mux有两个缺点:

  • 如果您需要url中的信息(例如
    /users/:id
    )您必须手动执行:

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

  • 默认的服务器mux不是最快的

  • 考虑以下结论:

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

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

    最近,我一直在避免使用默认的
    http.Handle
    http.HandleFunc
    函数,而是定义一个显式的
    http.Handle
    ,然后将其交给
    listenandservice
    。(而不是
    nil

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

    较新的开发人员发现
    http.Handle
    http.HandleFunc
    之间的区别微妙而令人困惑,因此我认为有必要先了解
    http.Handler
    的概念。mux只是另一种
    http.Handler
    (将请求路由到其他
    http.Handler
    的一种)当你依赖
    DefaultServeMux

    时,这种现实就被隐藏了起来。有很多路由器/多工器可供使用。内置的
    net/http
    一个是功能性的,像
    gorilla/mux
    这样的路由器/多工器有很多功能可供选择。
    httprouter
    坐在纤细的一端。我认为,如果你不得不问这个问题,几乎不存在(但永远不要说永远!)写自己的问题。路由器只是响应时间饼图中的一小部分。有很多共识是:“路由器只是响应时间饼图中的一小部分。”首先,以最简单的方式完成某些工作。在req.URL.Path上没有“SplitN”方法。而是使用:strings.SplitN(。。。