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应用的代码实现。

results matching ""

    No results matching ""