☰
chi:一个 Go HTTP 路由库
2026/10/12 16:45:53 网站建设 项目流程

文章目录

  • chi:一个 Go HTTP 路由库
    • 它解决了什么问题
    • 核心特点
    • 用法示例
    • 中间件生态
    • 谁适合用 chi
    • 总结
    • 总结

chi:一个 Go HTTP 路由库

做 Web 开发的人,对路由库的选择一直挺多。chi 这个项目目前有 22,464 个 Star,在 Pressly、Cloudflare、Heroku 等公司有过使用记录。

chi 的定位是:给 Go HTTP 服务提供一个路由层。它基于 Go 1.7 引入的 context 包实现,面向 REST API 项目。它专注于路由这一件事,没有试图包罗万象。

它解决了什么问题

写 Web 服务时,net/http 能处理请求,路由这块却比较基础。注册路由、参数解析、中间件链,自己拼起来比较繁琐。自己实现路由分组和参数校验,代码容易变长,也缺少统一风格。

很多项目早期用标准库写路由,代码少时没问题。等接口变多、中间件变多,就需要一个路由方案。chi 是为了解决这种规模下的组织问题。

chi 在 net/http 基础上补了这一层。它复用 http.Handler 和 http.HandlerFunc。这意味着你的中间件、工具函数,可以直接用。

核心特点

chi 的几个设计突出:

代码少。核心路由代码不到 1000 行。

零依赖。只依赖标准库。

走标准接口。所有中间件和 handler 都走 net/http 标准接口。

可组合。支持中间件、内联中间件、路由分组、子路由挂载。

context 驱动。基于 context 包实现请求数据传递、超时和取消信号。

有使用记录。Pressly、Cloudflare、Heroku 等公司在使用它。

路由树基于 Radix trie 实现。由于接口标准,社区中间件可以直接接入 chi,不需要写适配层。

用法示例

用法就几行:

r:=chi.NewRouter()r.Use(middleware.Logger)r.Get("/",handler)http.ListenAndServe(":3000",r)

路由参数也支持:

r.Get("/{articleSlug:[a-z-]+}",getArticleBySlug)r.Route("/articles",func(r chi.Router){r.Get("/{articleID}",getArticle)})

URL 参数通过 chi.URLParam 读取。嵌套路由支持代码拆分,你可以把模块路由拆到单独文件里,再用 Mount 组合起来。

context 驱动意味着你可以在中间件里设置请求变量,handler 通过 r.Context().Value 读取。这种方式和 Go 标准库一致,不需要记忆新 API。

中间件生态

chi 自带 Logger、Recoverer、Timeout、RequestID、StripSlashes 等中间件。中间件按 net/http 方式编写,可以用在其他框架里。

中间件按注册顺序执行。项目还提供了子包,覆盖响应序列化、路由文档生成、CORS、JWT 认证、限流等场景。docgen 子包可以从路由定义生成文档,适合维护 API 文档的团队。

谁适合用 chi

如果你写 Go REST 服务,又不想被重型框架绑定,chi 值得考虑。它把系统拆成模块,每个模块负责自己的路由和中间件。

如果你已经有基于 net/http 的代码,迁移到 chi 成本低,因为接口相同。对于新项目,chi 学习成本不高,几分钟就能搭起服务。

总结

chi 不是功能最多的路由库,但它稳定,文档清晰。22,464 个 Star 说明它经受住了时间考验,适合需要可控的项目。

。

总结

chi 不是功能最多的路由库,但它稳定,文档清晰。22,464 个 Star 说明它经受住了时间考验,适合需要可控的项目。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询