这有什么区别:
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)
}
答案 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将与默认值相同。它可用,以便您可以进一步自定义请求处理。