提升Go的HTTP路由器的提案( 二 )

这一过程颇为繁琐 。若你忘记了路径检查,那么你最终可能会将主页用于所有其他的 URL,而不是显示一个未找到的页面,因为所有的内容都在 / 之下 。
而根据新的提案,这个过程将变得更加简洁:
mux.HandleFunc("/{$}", serveHomepage)mux.HandleFunc("/users", serveUsers)实现参考Jonathan 在 github.com/jba/muxpatterns 中发布了一个 ServeMux 的增强版本的示例实现 。唯一的区别在于,由于它是在单独的包中,无法改变 http.Request 类型,所以你需要用 mux.PathValue(request, "name") 来获取路径值,而非 request.PathValue("name") 。
我在 我的 go-routing 仓库 中添加了一个 PR,这个 PR 提供了我自己的 widget API 的一种实现,使用 muxpatterns 。这个版本与 chi 版本 非常相似 —— 清晰且易读:
r.HandleFunc("GET /{$}", home)r.HandleFunc("GET /contact", contact)r.HandleFunc("GET /api/widgets", apiGetWidgets)r.HandleFunc("POST /api/widgets", apiCreateWidget)r.HandleFunc("POST /api/widgets/{slug}", apiUpdateWidget)r.HandleFunc("POST /api/widgets/{slug}/parts", apiCreateWidgetPart)r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/update", apiUpdateWidgetPart)r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/delete", apiDeleteWidgetPart)r.HandleFunc("GET /{slug}", widgetGet)r.HandleFunc("GET /{slug}/admin", widgetAdmin)r.HandleFunc("POST /{slug}/image", widgetImage)当我首次测试这个参考实现时,我发现了一些小问题,现已得到修复 。
结论尽管我对于扩展现有的 Handle 和 HandleFunc 方法有一些保留,但我对这个提案的考虑感到欣慰 。鉴于 Jonathan 在提案中的谨慎处理、他在 log/slog 上的良好表现以及社区的积极反馈,此提案被接受的可能性很高 。
如果这个功能能进入标准库,那将非常棒 —— 我开发的几乎所有网站和 REST 风格的 API 都将用到这个功能 。Go 的标准库已经非常强大,但加入这个功能将进一步减少对第三方路由器的依赖 。
如果这个功能能够集成在 2024 年 2 月发布的 Go 1.22 中,我并不会感到惊讶 。让我们拭目以待!
译者介绍刘汪洋,51CTO社区编辑,昵称:明明如月,一个拥有 5 年开发经验的某大厂高级 JAVA 工程师,拥有多个主流技术博客平台博客专家称号 。
原文标题:The proposal to enhance Go’s HTTP router,作者:Ben Hoyt




推荐阅读