http和默认servemux之间的区别?

时间:2016-04-28 17:07:20

标签: go

这有什么区别:

func main() {

  http.HandleFunc("/page2", Page2)
  http.HandleFunc("/", Index)
  http.ListenAndServe(":3000", nil)
}

使用golang serve mux

func main() {
  mux := http.NewServeMux()

  mux.HandleFunc("/page2", Page2)
  mux.HandleFunc("/", Index)
  http.ListenAndServe(":3000", mux)
}

3 个答案:

答案 0 :(得分:23)

第一个程序使用default serve mux。它与更详细的相同:

func main() {
  http.DefaultServeMux.HandleFunc("/page2", Page2)
  http.DefaultServeMux.HandleFunc("/", Index)
  http.ListenAndServe(":3000", http.DefaultServeMux)
}

两个程序之间存在一个重要区别:第一个程序无法完全控制程序中使用的处理程序。有些软件包会自动使用init()函数(example)中的默认服务多路复用器进行注册。如果程序直接或间接导入其中一个包,则这些处理程序注册的处理程序将在第一个程序中处于活动状态。

第二个程序完全控制与服务器一起使用的处理程序。使用默认服务mux注册的任何处理程序都将被忽略。

答案 1 :(得分:3)

默认多路复用器的定义如下:

var DefaultServeMux = NewServeMux()

所以实际上没有什么重大区别,除非你想进一步定制并需要一个明确的多路复用器(例如出于某种原因链接它们)。

但由于已经分配了默认值,因此无需无理由再创建另一个。

答案 2 :(得分:2)

ServerMux是一种实现Handler接口的类型,所有服务器都有一个。在您的第一个示例中,服务器只使用默认处理程序。我不认为这里存在差异,因为NewServeMux返回的mux将与默认值相同。它可用,以便您可以进一步自定义请求处理。