go web编程由浅入深1——注册简单handler函数

这个小系列我打算彻底弄懂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的形式相对应。

(全文完)

你可能感兴趣的:(go)