Iris中Query数组参数需手动调用c.Request().URL.Query().GetAll("key")获取完整字符串切片,再自行转换类型;其默认Query方法仅返回首值,结构体绑定和UnmarshalParam等机制均无法直接支持数组解析。

Query数组参数在Iris中默认不自动解析
Iris不会像某些框架(如Gin)那样自动把 ?ids=1&ids=2&ids=3 解析成 []string 或 []int。它把所有 query 值当作单个字符串处理,c.Query("ids") 只返回第一个值 "1",其余被静默丢弃。
根本原因是 Iris 的 url.Values 底层用的是标准库 net/url,而 Get() 方法只取首项;要拿到全部,必须用 GetAll() —— 但 Iris 的绑定方法(如 QueryValue、结构体绑定)没封装这层逻辑。
手动用 c.Request().URL.Query().GetAll() 拿原始数组
这是最直接、可控的方式,适用于任意类型转换场景:
-
c.Request().URL.Query().GetAll("ids")返回[]string{"1", "2", "3"} - 再用
strconv.Atoi或str2int等逐个转为[]int,注意错误处理 - 若参数名带方括号(如
?ids[]=1&ids[]=2),Iris 同样只认ids[]为键名,需显式调用GetAll("ids[]") - 空值或缺失参数时
GetAll()返回空切片,不是nil,可安全遍历
idsStr := c.Request().URL.Query().GetAll("ids")
var ids []int
for _, s := range idsStr {
if i, err := strconv.Atoi(s); err == nil {
ids = append(ids, i)
}
}
用结构体 + 自定义 UnmarshalParam 实现声明式绑定
如果你希望复用 Iris 的结构体绑定语法(比如 c.QueryParams(&req)),就得让结构体字段支持批量解析。Iris 允许实现 UnmarshalParam 接口:
- 定义字段为
[]string或自定义类型(如IntSlice) - 为该类型实现
UnmarshalParam(string) error,内部调用GetAll()并转换 - 注意:Iris 的
QueryParams会为每个字段调用一次UnmarshalParam,传入的是单个 query 值(非数组),所以仍得绕回c.Request().URL.Query()获取全局 map - 实际更推荐手动
GetAll,避免接口实现的隐式依赖和生命周期混淆
别踩 c.URLParam 和 c.FormValue 的坑
这两个方法完全不适用 query 数组:
-
c.URLParam("ids")是为路径参数设计的(如/user/:ids),对 query 字符串无效 -
c.FormValue("ids")只读 POST 表单或 multipart body,query string 不在此范围内 -
c.QueryValue("ids")和c.GetString("ids")都等价于Get(),永远只拿第一个 - 误用会导致看似“参数没传进来”,其实是拿错了入口
真正能覆盖所有 query 数组场景的,只有 c.Request().URL.Query().GetAll("key") 这一条路——它不依赖 Iris 封装,稳定、透明、无歧义。











