Iris高性能需严格遵循路由类型约束、Context复用、静态文件正确服务及JSON优化。必须用{param:type}声明路由参数,重用ctx而非新建,用app.HandleDir而非http.FileServer,全局配置JSON编码器。

路由匹配必须用 radix tree + 类型约束参数
Iris 的高性能起点是它的路由系统,但默认写法如 app.Get("/users/{id}", ...) 会退化为字符串遍历匹配,失去 radix tree 优势。必须显式声明参数类型,让 Iris 在编译期生成高效跳转逻辑。
-
{id:uint64}或{id:int min(1)}才触发类型校验与 radix tree 路径压缩 - 不加类型约束时,
ctx.Params().GetInt("id")会 panic,而GetIntDefault多一次类型转换开销 - 含正则的路径如
/posts/{slug:string regexp(^[a-z0-9\-]+$)}仍走 radix tree,但正则执行在匹配后,不影响路由树构建速度
Context 对象必须重用,禁止在中间件里 new Context
Iris 通过对象池复用 iris.Context 实例来避免 GC 压力,这是零内存分配的关键。一旦你在中间件或 handler 中手动 &context{...} 或调用非公开构造函数,就绕过了池机制,高并发下 GC 频率陡增。
- 所有上下文操作必须通过入参
ctx iris.Context进行,它是池中取出的实例 - 不要把
ctx保存到 goroutine、map 或结构体字段中——它会在请求结束时被放回池,下次可能已被复用 - 若需跨 handler 传递数据,用
ctx.Values().Set("key", value),底层是 sync.Pool 管理的 map,安全且无额外分配
静态文件服务必须用 app.HandleDir 而非 http.FileServer
直接包装 http.FileServer 会丢失 Iris 的上下文链和中间件控制,更关键的是它无法利用 Iris 内置的 etag、gzip、range 请求优化逻辑。
- 正确写法:
app.HandleDir("/static", iris.Dir("./assets")),自动启用协商缓存与压缩 - 若需自定义 header(如
Cache-Control: public, max-age=31536000),用app.Use(StaticHeadersMiddleware)包裹,而不是在 handler 里手动写 header - 避免用
app.Get("/static/*file", ...)+os.Open手动读取文件——每次请求都触发磁盘 I/O 和内存拷贝,吞吐量断崖下跌
JSON 序列化要避开 json.Marshal 默认行为
Iris 的 ctx.JSON 底层用的是 encoding/json,但默认配置未开启 SetEscapeHTML(false) 和 SetIndent("", ""),导致不必要的字符转义与空格插入,增加响应体积和 CPU 时间。
- 全局设置一次即可:
iris.RegisterJSONEncoder(func(e *json.Encoder) { e.SetEscapeHTML(false); e.SetIndent("", "") }) - 对时间字段,避免
time.Time直接序列化——默认输出带时区和微秒,体积大且前端解析慢;统一转为UnixMilli()或 ISO8601 精简格式 - 敏感字段(如 password)必须用
json:"-"或自定义MarshalJSON方法,否则ctx.JSON会原样输出,引发安全风险



















