大部分时候,咱们须要实现一个 Web 应用,第一反应是应该使用哪一个框架。不一样的框架设计理念和提供的功能有很大的差异。好比 Python 语言的 django
和flask
,前者大而全,后者小而美。Go语言/golang 也是如此,新框架层出不穷,好比Beego
,Gin
,Iris
等。那为何不直接使用标准库,而必须使用框架呢?在设计一个框架以前,咱们须要回答框架核心为咱们解决了什么问题。只有理解了这一点,才能想明白咱们须要在框架中实现什么功能。html
咱们先看看标准库net/http
如何处理一个请求。git
func main() { http.HandleFunc("/", handler) http.HandleFunc("/count", counter) log.Fatal(http.ListenAndServe("localhost:8000", nil)) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path) }
net/http
提供了基础的Web功能,即监听端口,映射静态路由,解析HTTP报文。一些Web开发中简单的需求并不支持,须要手工实现。github
hello/:name
,hello/*
这类的规则。当咱们离开框架,使用基础库时,须要频繁手工处理的地方,就是框架的价值所在。但并非每个频繁处理的地方都适合在框架中完成。Python有一个很著名的Web框架,名叫bottle
,整个框架由bottle.py
一个文件构成,共4400行,能够说是一个微框架。那么理解这个微框架提供的特性,能够帮助咱们理解框架的核心能力。golang
'/hello/:name
。这个教程将使用 Go 语言实现一个简单的 Web 框架,起名叫作Gee
,geektutu.com
的前三个字母。我第一次接触的 Go 语言的 Web 框架是Gin
,Gin
的代码总共是14K,其中测试代码9K,也就是说实际代码量只有5K。Gin
也是我很是喜欢的一个框架,与Python中的Flask
很像,小而美。web
7天实现Gee框架
这个教程的不少设计,包括源码,参考了Gin
,你们能够看到不少Gin
的影子。算法
时间关系,同时为了尽量地简洁明了,这个框架中的不少部分实现的功能都很简单,可是尽量地体现一个框架核心的设计原则。例如Router
的设计,虽然支持的动态路由规则有限,但为了性能考虑匹配算法是用Trie树
实现的,Router
最重要的指标之一即是性能。django
但愿这个教程可以对你有所启发,若是对 Gee 有任何好的建议,欢迎提issues - Github 和 PR。教程中的任何问题,能够直接在文章末尾评论。flask
原文地址:7天用Go从零实现Web框架Gee - 极客兔兔cookie