go 语言中一个web 请求会对应创建一个 goroutine 来处理整个请求. Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。
ListenAndServe 是创建web 服务器的关键函数 :
第一个参数为 addr 及网络地址, 为空代表 当前主机 80 端口
第二个参数为 http.handler, 如果为 nil 代表使用 DefaultServeMux
handler 为 http.Handler 接口的实现.
package main
import (
"net/http"
)
func main() {
server := http.Server{
Addr: ":8080",
Handler: nil,
}
server.ListenAndServe()
}
Handler 是一个接口, 作为创建web 服务时的第二个参数, 如果为 nil 则为一个 DefaultSeveMax [ 多路复用器 作为路由 ] .
2中模式的路由注册
可以使用 http.HandleFunc 和 http.Handle 注册路由, 2个函数第一个参数都是路径,第2个有所不同 :
http.HandleFunc 的第2个参数为一个复合格式的函数;
http.Handle 的第2个参数为一个具体 handler 的指针地址;
package main
import (
"net/http"
)
func home(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
}
type aboutHandler struct{}
func (ah *aboutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("About"))
}
func main() {
ah := aboutHandler{}
server := http.Server{
Addr: ":88",
// 使用 defaultServerMux
Handler: nil,
}
http.HandleFunc("/", home)
http.Handle("/about", &ah)
server.ListenAndServe()
}