c.Query()无法区分参数未传与传空,应配合c.GetQuery()安全判断;c.DefaultQuery()设默认值但需手动转类型;批量参数用c.Request.URL.Query();中文等需url.QueryUnescape()手动解码。

直接用 c.Query() 拿单个参数,但要注意空字符串和未传参的区别
如果 URL 是 /api/user?id=123&name=foo,c.Query("id") 返回 "123",c.Query("age") 返回空字符串 "" —— 它不区分“参数没传”和“参数传了但值为空”。实际业务中常要判断是否存在,得配合 c.GetQuery():
if value, exists := c.GetQuery("id"); exists {<br> // value 是 string,exists 是 bool<br>}这个组合才是安全的判断方式。
c.DefaultQuery() 适合设默认值,但别在关键逻辑里隐式兜底
比如 c.DefaultQuery("page", "1") 在没传 page 时返回 "1",省得写 if。但注意:它依然返回字符串,不是整数;如果后续要转 int,得自己用 strconv.Atoi(),且必须检查错误。常见坑是直接 int(c.DefaultQuery("limit", "20")) —— 这会编译失败,Go 不允许隐式类型转换。
批量取多个 Query 参数用 c.Request.URL.Query()
当需要遍历所有参数、或处理重复键(如 ?tag=a&tag=b)时,c.Query() 无能为力。c.Request.URL.Query() 返回 url.Values(本质是 map[string][]string),能拿到全部值:
queries := c.Request.URL.Query()<br>for key, values := range queries {<br> fmt.Printf("%s: %v\n", key, values) // tag: ["a", "b"]<br>}注意:values 是切片,即使只传一个值也得按数组取,比如 values[0]。Gin 的 Query 解析不自动解码,中文或特殊字符要自己处理
浏览器发的 ?q=%E4%BD%A0%E5%A5%BD(UTF-8 编码的“你好”),c.Query("q") 返回的是原始编码字符串 "%E4%BD%A0%E5%A5%BD",不是解码后的中文。Gin 默认不做 URL decode。要用 url.QueryUnescape() 手动解码:
if raw, ok := c.GetQuery("q"); ok {<br> decoded, err := url.QueryUnescape(raw)<br> if err == nil {<br> // decoded 是 "你好"<br> }<br>}漏掉这步,中文参数就变成乱码或解析失败。
立即学习“go语言免费学习笔记(深入)”;


















