用途:在编写 Gin 路由、handler、中间件、绑定与渲染时提供版本匹配的 API 参考。Go 语法交给 skills/langs/go;ORM、日志库、鉴权方案跟项目走,不在此指定,用户未点名不添加完整鉴权中间件。
定版本:读 go.mod 的 require github.com/gin-gonic/gin,有 replace 以 replace 为准,不使用本机 module cache 中较新的版本。取 1.y(v1.12.0→1.12),按对应文件写代码:1.10→references/1.10.md,1.11→references/1.11.md,1.12→references/1.12.md。未列出的更新 1.y 以已覆盖最高档为底,再查官方 changelog / pkg.go.dev;更旧版本不要使用本技能中的新 API。禁止凭训练数据写 API。
路由与中间件:相关路径用 Group,公共中间件挂 group 上。中间件是洋葱模型,c.Next() 前为前置、后为后置,先注册在最外层。gin.Default() = Logger + Recovery;生产要少中间件用 gin.New() 再显式 Use。生产设置 GIN_MODE=release 或 gin.SetMode(gin.ReleaseMode)。需要 405 时设 engine.HandleMethodNotAllowed = true(默认同路径错方法返回 404)。路径参数是 :id,用 c.Param("id"),不要 {id}。
绑定与响应:优先 ShouldBind* 并自写错误响应;Bind* 会直接 AbortWithError(400)。字段必须导出,用 json / form / uri / header + binding tag(go-playground/validator)。JSON body 用 ShouldBindJSON,query+form 用 ShouldBind,路径参数用 ShouldBindUri。写完响应就 return,不要二次 c.JSON。结构体响应优先于 gin.H。c.Error(err) 留给已有错误中间件。
Context:gin.Context 来自 sync.Pool,请求结束后复用,禁止存入 struct / 全局 / 请求结束后的 goroutine;goroutine 内读请求快照用 cCopy := c.Copy()。下游用 c.Request.Context(),不要把 gin Context 当 context.Context 传。取值优先 GetString / GetInt 等。ClientIP() 依赖受信代理,默认信任所有代理不安全:无反向代理设 SetTrustedProxies(nil),有则填代理 CIDR 或 CDN 用 TrustedPlatform。
限制:仅覆盖 Gin 1.y 的 1.10 / 1.11 / 1.12;更旧或未列出的更新版本需另查官方资料;其他生态库与鉴权方案由项目自行决定。