Go对web服务器的编写提供了非常好的支持,标准库中提供了net/http包来方便编写服务器。许多教程和书籍在讲到用Go编写web服务器时都会直接教新手用http包写一个最简单的hello world服务器,例子差不多都会像这样:
// 这就是用Go实现的一个最简短的hello world服务器.
package main
import "net/http"
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`hello world`))
})
http.ListenAndServe(":3000", nil) // <-今天讲的就是这个ListenAndServe是如何工作的
}
可以看到,代码真的非常简短,只需要几行,我们今天要分析的是http.ListenAndServe(),看看这里面到底都做了些什么。
首先,http.ListenAndServe用到的所有依赖都在Go源码中的/src/pkg/net/http/server.go文件中,打开它会发现这页代码非常长,有2000+行,我们Ctrl+F直接找我们感兴趣的部分,发现在1770行左右的部分找到了http.ListenAndServe的定义: