因为编译后的二进制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"
Handle: 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应用的代码实现。