fiber.New()是创建Fiber Web应用的起点,需导入包、调用fiber.New()、注册路由(如app.Get("/", handler))、调用log.Fatal(app.Listen(":3000"))启动;handler签名必须为func(*fiber.Ctx) error,且注意c.Params()等返回值非稳定字符串,异步使用需手动拷贝。

fiber.New()就是创建第一个 Web 应用的起点,不需要额外初始化或配置。
直接运行一个 GET / 服务
最简路径就是导入包、调用 fiber.New()、注册路由、监听端口。注意两点:返回值必须是 error 类型,且 handler 函数签名要匹配 func(*fiber.Ctx) error。
-
app.Listen(":3000")不会自动 panic,建议用log.Fatal(app.Listen(":3000"))捕获启动失败 - 如果端口被占用,错误信息是
listen tcp :3000: bind: address already in use,不是 Fiber 特有,但初学者常卡在这 - 不加任何配置时,
fiber.New()使用默认fiber.Config{},包括Immutable: false—— 这会影响后续取参行为(见下一条)
c.Params() 和 c.Query() 的值不能跨 handler 保存
Fiber 默认复用 *fiber.Ctx 内部缓冲区,所以 c.Params("id") 返回的是底层字节切片的引用,不是新分配的字符串。一旦 handler 返回,这块内存可能被下次请求覆盖。
- 错误写法:
id := c.Params("id"); go doSomething(id)——id在 goroutine 中大概率变成脏数据 - 安全写法:用
utils.CopyString(c.Params("id"))或手动拷贝:str := string(append([]byte(nil), c.Params("id")...)) - 或者在
fiber.New()时开启Immutable: true,代价是每次取参都多一次内存分配
app.Get() 路由参数和通配符写法差异
路径匹配逻辑和 Express 类似,但细节有别。比如 :id 是命名参数,* 是通配捕获,两者不能混用在同一段路径中。
-
app.Get("/user/:id", ...)→c.Params("id")取值 -
app.Get("/static/*", ...)→c.Params("*")取剩余路径(如/static/css/app.css→css/app.css) -
app.Get("/file/:name.:ext")→ 同时支持两个命名参数,c.Params("name")和c.Params("ext") - 不支持正则内联写法(如
:id([0-9]+)),需靠中间件或手动校验
为什么 c.SendString() 比 c.JSON() 快,但别乱用
c.SendString() 直接写入响应体,零序列化开销;c.JSON() 底层调用 json.Marshal(),有反射和内存分配成本。
- 返回固定字符串(如健康检查
/ping)用c.SendString("pong")更合适 - 返回结构体或 map 时必须用
c.JSON(),否则得到的是&{...}这种 Go 内存表示 -
c.Status(200).SendString(...)和c.SendString(...)效果一致,因为默认就是 200,显式设状态码只在非 200 时必要
Fiber 的“第一个应用”看似简单,真正容易出问题的地方不在启动,而在 handler 内对上下文值的误用——尤其是把 c.Params()、c.Body()、c.FormValue() 的返回值当成稳定字符串保存或传给异步任务。这个点不提前意识到,上线后会出现偶发性乱码或 panic,而且很难复现。











