这个小系列我打算彻底弄懂golang的Http库,一点一滴慢慢深入。下面是最简单的go web编程例子。
通过把一个简单的函数注册到http服务器的路由中去。
package main
import (
"io"
"net/http"
)
func main () {
http.HandleFunc("/", sayHi)
if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
panic(err)
}
}
func sayHi(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hi, this is simple handler function.")
}
深入观察这个过程,先看看http.HandleFunc函数的声明形式
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
看到第二个参数是一个函数指针,这个函数指针被注册到一个叫DefaultServeMux的奇怪的对象里面去了。这个Mux是Mutex的缩写,意思是互斥量。有点蒙,互斥量不是解决并发的一种技术手段吗,这怎么叫这个名字?
暂时不管,深入看看这个DefaultServeMux是何方神圣
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux
还得再深入看看
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry
es []muxEntry // slice of entries sorted from longest to shortest.
hosts bool // whether any patterns contain hostnames
}
type muxEntry struct {
h Handler
pattern string
}
初看之下,我只看懂这里有个slice,存储了pattern和它相对应的handler。其他的暂时没看懂。
最大的收获就是底层是用一个ServeMux的对象来维护pattern和handler的,二者类似于key-value的形式相对应。
(全文完)