handle 详解

golang 是如何处理 web 请求的?

go 语言中一个web 请求会对应创建一个 goroutine 来处理整个请求.  Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。

ListenAndServe 函数

ListenAndServe 是创建web 服务器的关键函数 :

第一个参数为 addr 及网络地址, 为空代表 当前主机 80 端口
第二个参数为 http.handler, 如果为 nil 代表使用 DefaultServeMux

handler 为 http.Handler 接口的实现.

创建 web 服务的第二种写法

package main
import (
	"net/http"
)
func main() {
	server := http.Server{
		Addr:    ":8080",
		Handler: nil,
	}
	server.ListenAndServe()
}

Handler

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()
}