1、http简单使用
go的http标准库非常强大,调用了两个函数就能够实现一个简单的http服务:
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
func ListenAndServe(addr string, handler Handler) error
handleFunc注册一个路由和相应的处理函数,第一个参数表示注册的路由,第二个参数表示注册路由对应的处理函数;ListenAndServe用来启动http服务并监听,第一个参数是服务器地址,第二个参数表示使用的处理器。
下面是用这两个函数实现的简单的http服务:注册了一个“/”路由的处理函数,并在8080端口启动http服务,ListenAndServe第二个参数为空表示使用标准库默认的处理器,也可使用自定义处理器,传参即可。处理器的概念在下面标准库分析中进行介绍。
import (
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// TODO
})
http.ListenAndServe(":8080", nil)
}
2、http标准库分析
根据上面的两个函数来对http标准库展开分析
2.1、服务端数据结构
首先介绍下这两个函数涉及到的数据类型
(1)服务器对象,其中最核心的是Handler成员,表示整个http服务的路由器,存储路由路径对应到处理函数的映射,可自定义,例如第1小姐中的案例,没有自定义路由器对象,就会使用标准库提供的默认对象DefaultServeMux
type Server struct {
Addr string // 地址 host:port
Handler Handler // 处理器对象或路由器
// ...
}
(2)Handler是一个接口,提供了ServeHTTP方法,用来将路由映射到相应的处理函数上
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
(3)路由器对象ServeMux,用来存储路由到处理函数的映射关系,该对象就是Handler接口的具体实现。
type serveMux struct {
mu sync.RWMute