Go-Chi Chi:Go 语言里最轻量的 HTTP 路由,22K Star 的项目只靠 1000 行代码
Go-Chi Chi:Go 语言里最轻量的 HTTP 路由,22K Star 的项目只靠 1000 行代码
chi 在 GitHub 上拿到了 22.2K Star。这个 Go 语言的 HTTP 路由库,核心代码不到 1000 行。
它的设计思路很直接:只依赖 Go 标准库,完全兼容 net/http,用极少的代码量提供构建 REST API 所需的全部能力。
1、chi 解决了什么问题
Go 标准库的 net/http 能处理 HTTP 请求,但路由功能偏基础。没有 URL 参数解析、没有路由分组、没有中间件链。第三方路由库往往引入额外依赖,接口也不完全兼容标准库。
chi 的定位是在标准库之上做一层薄封装。它不定义自己的 Handler 类型,不引入上下文抽象,所有 handler 都是标准的 http.Handler。这意味着你能直接用生态里已有的中间件,不用做任何适配。

2、路由设计:组合优于继承
chi 的路由提供了 Group、Route、Mount、With 四种组织方式。
Group 创建内联路由器,用于给一组路由统一添加前缀;Route 在指定 pattern 下挂载子路由;Mount 可以接入另一个完整的 http.Handler;With 为单个端点附加行内中间件,不产生新的路由组。
这种分层结构很适合 REST 接口的场景。一个典型的 /articles 资源,可以拆成 GET /articles(列表)、POST /articles(创建)、/articles/{articleID} 子路由(单个资源的 CRUD),每一层都能独立控制中间件。

3、中间件体系
chi 自带一个 middleware 包,包含 20 多种中间件:Logger、Recoverer、Timeout、RequestID、RealIP、Compress、Throttle、BasicAuth 等。
中间件本身就是标准 net/http 中间件,签名是 func(http.Handler) http.Handler。社区里任何兼容 net/http 的中间件都可以直接接入,不需要包装层。
除了内置的,go-chi 组织下还有一组扩展包:cors、JWT 认证(jwtauth)、域名路由(hostrouter)、限流(httprate)、请求追踪(httptracer)、请求合并(stampede)等,按需选用。
4、URL 参数和上下文传递
chi 的路由模式支持命名参数和正则约束。/users/{userID} 匹配任意路径段,/articles/{articleSlug:[a-z-]+} 限定参数格式。URL 参数通过 chi.URLParam(r, "userID") 在 handler 中读取,底层存在请求上下文里。
上下文传递是 chi 的工作机制。中间件通过 context.WithValue 注入数据,后续 handler 从 r.Context() 中读取。这个模式贯穿整个请求生命周期,从认证注入用户信息,到超时控制,再到参数解析,全部走同一套机制。
5、适合哪些场景
- 需要标准库兼容的新项目,不希望被框架锁定
- 已有基于 net/http 的代码,想渐进式引入更好的路由能力
- REST API 服务,路由层次多,需要中间件精细控制
- 追求轻量和可控的团队,想要读懂路由代码本身
chi 在生产环境中经过了验证,Cloudflare、Heroku 等公司都在使用。对于大多数 Go HTTP 服务的需求来说,1000 行代码的 chi 已经够用。

浙公网安备 33010602011771号