造轮子系列, 7 天用 Golang 动手写 Web 框架 Gee,基于 net/http 手撸。

2019-08-20 17:37:32 +08:00
 gzdaijie

最近接触 Golang,发现 Web 框架中 Gin 和 Flask 一样简洁啊。后来看了下源码就几千行。7 天撸了一个,代码刚好 500 行,七天写完,恰好有了 7 个 Star,每天的代码都放在单独的目录了。。

Github 求一波 Stargeektutu/7days-golang

教程更新到第二天了,写字比写代码累啊 动手撸 Web 框架 Gee

适合对 Golang Web 感兴趣的同学参考。使用效果和 Gin 一模一样

func main() {
	r := gee.Default()
	r.Use(gee.Logger()) // global midlleware
	r.GET("/", func(c *gee.Context) {
		c.HTML( http.StatusOK, "custom_func.tmpl", gee.H{
			"title": "gee",
			"now":   time.Date(2019, 8, 17, 0, 0, 0, 0, time.UTC),
		})
	})

	v2 := r.Group("/v2")
	v2.Use(onlyForV2()) // v2 group middleware
	{
		v2.GET("/hello/:name", func(c *gee.Context) {
			// expect /hello/geektutu
			c.String( http.StatusOK, "hello %s, you're at %s\n", c.Param("name"), c.Path)
		})
	}

	r.Run(":9999")
}
3732 次点击
所在节点    程序员
11 条回复
BORBER
2019-08-20 17:39:56 +08:00
大佬大佬
Ritter
2019-08-20 17:41:46 +08:00
star 了 xueo 习一下
ziyue002
2019-08-20 17:58:42 +08:00
不错 支持~
befovy
2019-08-20 18:02:17 +08:00
大佬这是 7 天工作之余的时间吗
fyyz
2019-08-20 18:02:41 +08:00
我也在做类似的,但是我觉得路由可以做正则表达式支持

比如:/product/page/{{ ^[0-9]*$ }}
wsseo
2019-08-20 18:11:27 +08:00
所以为什么要造轮子
fireindark
2019-08-20 18:44:55 +08:00
感觉 gin 的 router 有点坑爹
gzdaijie
2019-08-20 18:49:43 +08:00
@befovy #4 996 后还熬夜+周日写的,看提交时间就知道有多惨了。不过每天的内容就 50 行以内,大部分时间在思考如何实现,代码其实很少。
gzdaijie
2019-08-20 18:51:05 +08:00
@wsseo #6 不是为了用而造轮子,每一天的代码单独放一个目录,明显是想逐步学习如何设计一个框架。
jaskle
2019-08-20 18:52:52 +08:00
自己用没有必要搞一些花里胡哨的路径匹配,内容合适基本也就定死几个常用的,所以自己封装也并不困难,而且也好控制内容,但个人感觉顺手是关键
gzdaijie
2019-08-20 20:38:48 +08:00
@fyyz @fireindark @jaskle

gin 一开始的版本 router 不是自己实现的,而是直接使用了开源的 httprouter,后来不知道为啥自己实现了,功能的确很弱。我实现的也只支持 /:name /*file 这两种。/:name 是普通的参数解析,/*file 是为了支持静态服务器,需要匹配多级子路径。gorouter,是个国人造的轮子,用的人也蛮多的,支持正则解析等复杂场景,可以参考下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/593583

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX