gin中参数获取需按位置和格式选择方法:路径参数用c.param()且路由必须声明:id;query参数单个用c.query()、批量校验用c.shouldbindquery();json请求必须用shouldbindjson()并确保结构体字段导出且带json标签;所有bind方法仅可调用一次。

Gin 里拿参数不是“选一个方法就行”,而是得看参数在哪、是什么格式、要不要校验——选错方法轻则值为空,重则 panic 或绕过校验。
怎么取 URL 路径里的 :id 这种参数
路径参数必须在路由定义时用 :name 显式声明,否则 c.Param("name") 永远返回空字符串。
-
c.Param("id")只对匹配的路由生效,比如r.GET("/user/:id");写成/user?id=123就拿不到 - 通配符
*action会捕获剩余路径,要用c.Param("action"),不是c.Query("action") - 多个路径段如
/post/:year/:month/:day,每个都得单独c.Param拿,不自动展开成 map
Query 参数(?key=value)该用 Query 还是 ShouldBindQuery
单个字段用 c.Query() 或 c.DefaultQuery() 最直接;批量或带校验就上 c.ShouldBindQuery()。
-
c.Query("page")返回空字符串而非0,别直接转 int,先判空 -
c.ShouldBindQuery(&v)会按 struct tag 解析,比如Age int `form:"age" binding:"required"`,缺字段就报错 - Query 参数不区分大小写,但 struct tag 里的
form名必须完全匹配,form:"Name"和?name=xxx不匹配
Post 请求体里是 JSON,为什么 ShouldBindJSON 有时不报错但字段为空
常见原因是结构体字段没导出(首字母小写),或者 JSON key 和 struct tag 对不上。
- Gin 只能绑定**导出字段**(大写开头),
type User { name string }的name永远不会被赋值 - 默认按 JSON key 绑定,
{"user_name":"alice"}配UserName string `json:"user_name"`才行,光写UserName不加 tag 会找"username" -
c.ShouldBindJSON()内部调用json.Unmarshal,遇到类型不匹配(比如 string → int)会静默失败并留零值,建议加binding:"required"强制检查
表单数据(x-www-form-urlencoded 或 multipart)用 PostForm 还是 ShouldBind
c.PostForm() 简单粗暴,适合快速取值;c.ShouldBind() 自动识别 Content-Type 并分发,但行为更隐蔽。
-
c.PostForm("email")对multipart/form-data和application/x-www-form-urlencoded都有效,但不校验类型 -
c.ShouldBind(&v)会根据Content-Type头自动选解析器:是 form 就走 form 绑定,是 JSON 就走 JSON 绑定——容易误触发,尤其前端漏设 header 时 - 上传文件必须用
c.FormFile("file"),PostForm拿不到文件内容,只拿普通字段
最易被忽略的点:所有 Bind 方法(ShouldBindJSON、ShouldBindQuery 等)**只能调用一次**,因为它们会消费请求 body。重复调用会读到空数据,后续绑定全失败。











