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的形式相对应。

(全文完)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值