用golang写gee(day1)

目录

项目地址:https://geektutu.com/post/gee-day1.html

实现

第一天主要介绍net/http模块的用法,实现了里面的Handler interface,从而接管了整个http库的行为。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// net/http主要进入函数
func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

// Handler接口如下
type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}

所以自己完全可以封装一个Handler。另外简单实现了一个string map router,记录了所有的处理函数,并实现了添加和调用这些处理函数的接口。核心封装函数如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type HandlerFunc func(http.ResponseWriter, *http.Request)

type Engine struct {
	router map[string]HandlerFunc
}

func New() *Engine {
	return &Engine{make(map[string]HandlerFunc)}
}

func (engine *Engine) addRouter(method string, pattern string, handler HandlerFunc) {
	key := method + "-" + pattern
	engine.router[key] = handler
}

func (engine *Engine) GET(pattern string, handler HandlerFunc) {
	engine.addRouter("GET", pattern, handler)
}

func (engine *Engine) POST(pattern string, handler HandlerFunc) {
	engine.addRouter("POST", pattern, handler)
}

func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	key := req.Method + "-" + req.URL.Path
	if handler, ok := engine.router[key]; ok {
		handler(w, req)
	} else {
		fmt.Fprintf(w, "404 NOT FOUND: %q", req.URL.Path)
	}
}

func (engine *Engine) Run() {
	http.ListenAndServe(":9999", engine)
}

总结

第一天的内容还是较为简单的,主要是简单封装了一下net/http库。还有就是感觉用go写出来的代码都长得差不多,像func New()这种写法都是固定的。

0%