chi:一个 Go HTTP 路由库 文章目录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 说明它经受住了时间考验适合需要可控的项目。