c.query 是 fiber 获取单个 url 查询参数最直接的方式,返回 string 且不解析、不校验、不转类型;c.queries() 返回 map[string][]string 支持多值,二者均不校验合法性,需手动处理默认值、类型转换与空值。

c.Query 是 Fiber 获取单个 URL 查询参数最直接的方式,返回 string,不解析、不校验、不自动转类型——这是它快的原因,也是你容易出错的起点。
用 c.Query("key") 拿单个值,但别忘了默认值和空字符串
Fiber 的 c.Query 默认返回空字符串 "",不是 nil 或 None。如果 URL 里压根没这个参数,比如访问 /search 却调用 c.Query("q"),结果就是 ""。
- 带默认值写法:
c.Query("page", "1")—— 参数缺失或为空时返回"1" - 别直接
int(c.Query("id")):字符串转数字必须手动处理,推荐用strconv.Atoi(c.Query("id"))并检查 error - 布尔类参数(如
?debug=true)不能靠== "true"简单判断:要考虑大小写、空格、"1"、"on"等常见变体,建议封装成小函数
c.Queries() 返回 map[string][]string,适合多值或动态键场景
当 URL 出现重复 key,比如 /tags?name=go&name=fiber&name=web,c.Query("name") 只取第一个 "go";而 c.Queries() 返回的是 map[string][]string{"name": {"go", "fiber", "web"}}。
- 它不保证键顺序,也不过滤空值,
?a=&b=1会得到map["a"]=[""] - 如果想转成普通
map[string]string(只留每个 key 的第一个值),得自己遍历:for k, v := range c.Queries() { if len(v) > 0 { m[k] = v[0] } } - 注意:它和
c.Params完全无关——路径参数(如/user/:id)走c.Params("id"),查询参数永远走c.Query或c.Queries
别和 Flask 的 request.args 混淆:Fiber 没有“自动合并”或“type 转换”机制
Flask 的 request.args.get("page", type=int) 会静默失败并回退到 default;Fiber 没这层包装。所有类型转换、错误兜底、空值语义都得你自己写。
- 没有
getlist方法:要取多值,只能用c.Queries()["key"],再判空和长度 - 没有
to_dict():c.Queries()返回的就是map[string][]string,不是类字典对象 - 没有
request.values这种混合视图:Fiber 明确区分来源——c.Query只读 ? 后面,c.Body/c.FormValue处理 POST body,不会自动 fallback
真正容易被忽略的点是:Fiber 的 c.Query 和 c.Params 都不校验参数是否存在或是否合法,它只是“原样提取”。你写的每行取参逻辑,其实都在隐式承担数据契约的责任——URL 设计变了、前端传错了、中间代理重写了 query string,都会直接穿透到你的业务代码里,没有任何缓冲层。











