7天用 Go 从零实现 Web 框架 Gee
设计一个框架
在设计一个框架之前,我们需要回答框架核心为我们解决了什么问题。只有理解了这一点,才能想明白我们需要在框架当中实现什么功能。
首先我们来看一下标准库 net/http
如何处理一个请求:
func main() {http.HandleFunc("/", handler)http.HandleFunc("/count", counter)log.Fatal(http.ListenAndServe("localhost:8080", nil))
}func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}
net/http
提供了基础的 Web 功能,即监听端口、映射静态路由、解析 HTTP 报文。一些 Web 开发中简单的需求并不支持,需要手工实现,比如:
- 动态路由:例如
hello/:name
,hello/*
这类的规则; - 鉴权:没有分组/统一鉴权的能力,需要在每个路由映射的 handler 中实现;
- 模板:没有统一简化的 html 机制。
当我们离开框架,使用基础库时,需要频繁手动处理的地方,就是框架的价值所在。
Gee 框架
本项目参考 Geektutu 大佬七天用 Go 从零实现系列当中的 Gee Web 框架,实现一个简单的 Web 框架,参考资料来自于 Geektutu 大佬本人的博客:https://geektutu.com/post/gee.html。