必须显式设置goproxy(如go env -w goproxy=https://goproxy.cn,direct),否则go mod init后go get或go mod tidy会因默认不走代理而无限超时;生产环境禁用gin.default(),须用gin.new()手动配置中间件并设gin.releasemode,且参数绑定必须使用结构体+binding校验,路径参数须强制类型转换与合法性校验。

go mod init 后必须显式设置 GOPROXY
国内直接 go get 会卡在 github.com/gin-gonic/gin,不是网络问题,而是 Go 默认不走代理。不设 GOPROXY,go mod tidy 或 go get 会无限超时或报 unknown revision。
- 执行
go env -w GOPROXY=https://goproxy.cn,direct(推荐)或https://proxy.golang.org(需科学上网) - 别只设一次就以为完事——新终端、CI 环境、Docker 构建都得重新设,建议写进 shell profile
-
GO111MODULE=on现在是默认值,不用额外设;但老项目若没go.mod,go run会 fallback 到 GOPATH 模式,导致依赖混乱
gin.Default() 不能用于生产环境
启动时看到 [GIN-debug][WARNING] Running in "debug" mode 就该警觉:gin.Default() 自带 Logger 和 Recovery 中间件,但日志全量输出、panic 堆栈直接返回给客户端,线上等于裸奔。
- 生产必须用
gin.New()+ 手动挂载中间件,比如只记录 error 级日志、panic 时返回统一错误页 -
gin.SetMode(gin.ReleaseMode)只关掉 debug 日志,不关掉 Recovery 的堆栈输出,所以光设 mode 不够 - 别信“先跑起来再优化”——上线前漏掉这步,第一个 500 就暴露完整路径和变量名
c.ShouldBindJSON() 必须配 struct,禁用 map[string]interface{}
用 map[string]interface{} 接参看着省事,实际埋了三颗雷:字段零值覆盖、IDE 无提示、校验失效。前端传 {"name": ""},后端结构体字段如果是 string 类型且没加 omitempty,DB 原值就被清空。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 定义接收结构体时,字段首字母必须大写,否则
json.Unmarshal无法赋值 - 必填字段加
binding:"required",数字 ID 加binding:"required,numeric",邮箱加binding:"email" - 错误时
c.ShouldBindJSON()自动返回422 Unprocessable Entity,不用手写c.AbortWithStatusJSON(http.StatusUnprocessableEntity, ...) - 千万别在 handler 里自己调
json.Unmarshal,否则绕过 Gin 的绑定校验和错误统一处理
路径参数必须转类型并校验,不能直接拼 SQL
c.Param("id") 返回的是字符串,直接丢给 db.QueryRow("SELECT * FROM users WHERE id = ?", id) 看似能跑,但一旦传入非数字(如 /users/abc),要么查不到,要么触发 strconv.Atoi panic,更糟的是拼 raw query 时可能 SQL 注入。
- 用
strconv.ParseUint(c.Param("id"), 10, 64)转uint64,检查err != nil后立刻c.AbortWithStatusJSON(http.StatusBadRequest, ...) - ID 是 UUID 就用
uuid.Parse(c.Param("id")),别用正则粗筛——/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/漏掉大小写和格式变体 - 所有从 URL、Query、Header 提取的值,只要参与 DB 查询或权限判断,都得走类型转换+范围校验,没有例外
Gin 环境搭得快,但真正决定 API 是否健壮的,是那些没写在 hello world 例子里的细节:代理配置是否落地、debug 模式是否关闭、参数绑定是否强类型、路径参数是否校验。这些点单看都很小,合起来就是线上服务能不能扛住第一波真实请求。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










