gin中get参数提取需区分query()(返回空串)、defaultquery()(设默认值)、getquery()(判存在性)、queryarray()(取数组)及bindquery()(结构体绑定校验)。

在Gin开发中,你需要从URL的?号后快速提取id、name、page等GET参数,同时避免因缺失参数导致空值panic或逻辑中断,比如访问/user/list?page=2时缺了page就该自动设为1。
用Query()获取原始参数值
直接调用ctx.Query("key")获取URL查询字符串中的值,例如http://localhost:8080/user?id=123 → ctx.Query("id")返回"123"字符串。
如果URL里根本没有这个key,Query()会返回空字符串"",不是nil也不是报错——这点必须记住,后续做int转换前得自己判空。
ctx.Query("sort") → 返回浏览器传来的sort值,没有则为空串。
用DefaultQuery()设置安全默认值
当你明确知道某个参数缺失时该用什么兜底,就用DefaultQuery。它俩行为一致:有值取值,没值给默认。
方法一:指定字符串默认值
ctx.DefaultQuery("page", "1") → 若URL为/user/list,无page参数,自动返回"1";若为/user/list?page=3,则返回"3"。
方法二:配合类型转换使用(推荐)
pageStr := ctx.DefaultQuery("page", "1")
page, _ := strconv.Atoi(pageStr) → 这样哪怕前端乱传page=abc,至少不会panic,但注意Atoi失败返回0,需额外校验。
【page参数未传时默认为1,但DefaultQuery不校验类型,传入非数字字符串会导致strconv.Atoi转出0】
用GetQuery()判断参数是否存在
需要区分“参数值为空”和“参数根本没传”两种情况时,必须用GetQuery(),它返回值+布尔标识。
第一步:调用ctx.GetQuery("token") → 返回string和bool两个值。
第二步:用短变量声明接收
token, exists := ctx.GetQuery("token")
第三步:根据exists做分支处理
if !exists { /* 参数完全没出现在URL里 */ } else if token == "" { /* 参数存在但值为空,如?token= */ }
这一步不能用Query()替代,因为Query("token")在?token=和?token完全没出现时都返回"",无法区分。
批量获取数组型参数
当URL含多个同名参数,如/user?tag=golang&tag=web&tag=api,用QueryArray一次拿到全部。
tags := ctx.QueryArray("tag") → 返回[]string{"golang", "web", "api"}。
如果URL里一个tag都没有,QueryArray返回空切片[]string{},不是nil,可直接len()判断。
绑定结构体自动解析GET参数
参数多且固定时,比逐个Query更干净,还能自动类型转换和校验。
定义结构体,字段加form标签:
type UserQuery struct {
ID int64 `form:"id"`
Name string `form:"name"`
Age int `form:"age"`
}
在路由handler里调用:
var q UserQuery
if err := ctx.BindQuery(&q); err != nil {
ctx.JSON(400, gin.H{"error": "参数格式错误"})
return
}
此时http://localhost:8080/user?id=100&name=lee&age=25会自动把id转成int64、age转成int,非法值(如age=abc)触发err非nil。











