初始化 gin 项目需严格按顺序执行:mkdir myapi && cd myapi;go mod init myapi;go get -u github.com/gin-gonic/gin;go mod tidy(必须,确保依赖完整)。

怎么初始化 Gin 项目并装好依赖
直接用 go mod init 初始化模块,再 go get 装 Gin,别跳步骤。很多新手卡在 go run main.go 报错“package not found”,其实是没生成 go.mod 或没执行 go mod tidy 拉依赖。
推荐命令顺序:
mkdir myapi && cd myapigo mod init myapigo get -u github.com/gin-gonic/gin-
go mod tidy(这步必须做,尤其换环境或 CI 构建时)
如果本地 GOPROXY 没配,go get 可能超时或失败;建议提前设 go env -w GOPROXY=https://goproxy.cn,direct。
路由注册顺序写错会吞掉请求
gorilla/mux 和 chi 是按最长前缀匹配,但 Gin 的底层是 httprouter,它严格按注册顺序逐条比对。这意味着 r.GET("/users/:id", ...) 如果写在 r.GET("/users/me", ...) 前面,/users/me 就永远收不到请求——:id 先匹配成功,me 被当成 ID 字符串传进去了。
正确做法:
- 静态路径放前面:
/users/me、/users/count - 带正则约束的参数路径放后面:
/users/:id→ 改成/users/:id^[0-9]+$(Gin 不原生支持正则,得用router.GET("/users/:id", handler).HandlerFunc(...)手动校验,或改用gin.Engine.Use()做前置过滤) - 真要靠路径区分,优先用不同前缀,比如
/users/me和/users/item/:id
c.ShouldBindJSON() 为什么总解不出字段
常见现象:前端 POST {"name": "Alice"},后端结构体字段却是空字符串。原因基本就三个:
- 结构体字段没大写首字母 → Go 导出规则限制,
json标签无效 - 漏了
json:"name"标签 → 字段名和 JSON key 对不上 - 用了
map[string]interface{}接参 → 绕过类型检查,IDE 补全、字段校验、Swagger 文档全丢
正确写法示例:
type User struct {
ID uint `json:"id"`
Name string `json:"name" binding:"required"`
Age *int `json:"age,omitempty"` // 指针 + omitempty,避免零值覆盖
}
然后在 handler 里写 var u User; if err := c.ShouldBindJSON(&u); err != nil { ... }。别手写 json.Unmarshal(),否则错误不进 Gin 的统一日志和中间件。
HTTP 状态码不能只用 200 和 500
前端 fetch 或 axios 默认只在状态码 ≥400 时进 catch。如果你所有错误都返回 200 + {"code": 404, "msg": "not found"},前端永远感知不到失败,重试、提示、跳转全失效。
该用什么码,看语义:
- 资源不存在 →
http.StatusNotFound(404) - 创建成功 →
http.StatusCreated(201),并设c.Header("Location", "/users/123") - 参数校验失败(如邮箱格式错)→
http.StatusUnprocessableEntity(422),不是 400 - DB 连接失败 →
http.StatusServiceUnavailable(503),不是 500(500 只留给未 recover 的 panic)
最容易被忽略的是路径参数转换:用 c.Param("id") 拿到的是字符串,不做 strconv.ParseUint(...) 就直接查 DB,要么查不到,要么 panic 崩溃。ID 是 UUID 的话,必须用 uuid.Parse(),别信正则粗筛。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











