2.4.1 多路复用器
因为编译后的二进制Go应用总是以 main
函数作为执行的起点,所以我们在对Go应用进行介绍的时候也总是从包含 main
函数的主源码文件(main source code file)开始。ChitChat应用的主源码文件为 main.go
,代码清单2-1展示了它的一个简化版本。
代码清单2-1 main.go
文件中的 main
函数,函数中的代码经过了简化
package main
import (
"net/http"
)
func main() {
mux := http.NewServeMux()
files := http.FileServer(http.Dir("/public"))
mux.Handle("/static/", http.StripPrefix("/static/", files))
mux.HandleFunc("/", index)
server := &http.Server{
Addr: "0.0.0.0:8080",
Handler: mux,
}
server.ListenAndServe()
}
main.go
中首先创建了一个多路复用器,然后通过一些代码将接收到的请求重定向到处理器。 net/http
标准库提供了一个默认的多路复用器,这个多路复用器可以通过调用 NewServeMux
函数来创建:
mux := http.NewServeMux()
为了将发送至根URL的请求重定向到处理器,程序使用了 HandleFunc
函数:
mux.HandleFunc("/", index)
HandleFunc
函数接受一个URL和一个处理器的名字作为参数,并将针对给定URL的请求转发至指定的处理器进行处理,因此对上述调用来说,当有针对根URL的请求到达时,该请求就会被重定向到名为 index
的处理器函数。此外,因为所有处理器都接受一个 ResponseWriter
和一个指向 Request
结构的指针作为参数,并且所有请求参数都可以通过访问 Request
结构得到,所以程序并不需要向处理器显式地传入任何请求参数。
需要注意的是,前面的介绍模糊了处理器以及处理器函数之间的区别:我们刚开始谈论的是处理器,而现在谈论的却是处理器函数。这是有意而为之的——尽管处理器和处理器函数提供的最终结果是一样的,但它们实际上并不相同。本书的第3章将对处理器和处理器函数之间的区别做进一步的说明,但是现在让我们暂时先忘掉这件事,继续研究ChitChat应用的代码实现。