Fiber路由性能优化关键:用c.QueryBytes()和c.BodyBytes()避免拷贝;JSON解析直接传指针;注意Content-Type、body仅可读一次;区分c.Params()与c.Query();ctx不可跨goroutine使用。

app.Get 和 app.Post 是 Fiber 最基础的路由注册方式,直接对应 HTTP 方法,用法简单但有几个关键点不注意就容易出错或掉性能。
怎么写 GET 和 POST 路由才不退化性能
Fiber 底层用的是 fasthttp,默认零内存分配,但一旦在 handler 里调用 c.Body() 或 c.Query() 返回新字符串,就会触发拷贝;高并发下延迟会明显上升。
- 用 c.QueryBytes() 替代 c.Query(),直接取底层字节 slice(前提是只读、不修改)
- POST 请求体尽量用 c.BodyBytes(),而不是 c.Body()
- 如果要解析 JSON,直接传指针给 c.Body() 后用 json.Unmarshal,别先转成 string 再解析
- 所有 c.Params()、c.Queries() 等批量获取方法都返回 map[string][]string,注意 key 重复时是切片,不是单值
POST 请求体读取失败的常见原因
c.Body() 返回空不是因为没发数据,而是因为:
- 前端没设 Content-Type: application/json(JSON 场景)或 application/x-www-form-urlencoded(表单场景)
- 中间件提前读过 body(比如自定义日志中间件调了 c.Body()),fasthttp 的 body 只能读一次
- 使用了 c.FormValue() 却没发 multipart/form-data 或没带正确 boundary
- 微信/支付宝回调等第三方请求可能用 raw text 或 XML,得用 c.BodyBytes() + 手动解析,不能依赖 c.Body()
GET 参数和路由参数别混用
- c.Params("id") 只取路径里的占位符,比如 /user/:id 中的 id
- c.Query("page") 取 URL query string,比如 ?page=2
- c.Queries() 返回全部 query,但注意它不自动解码空格或加号,需要自己调 url.QueryUnescape
- 如果路径是 /search/:q,而实际请求是 /search/hello+world,c.Params("q") 拿到的是 "hello+world",不是 "hello world"
Fiber 的 ctx 是从 sync.Pool 复用的,不能跨 goroutine 保存或传递——比如在 handler 里起 goroutine 并把 c 传进去,后续调用 c.SendString 可能 panic 或写脏数据。











