gin.default() 默认启用 logger 和 recovery 中间件,适合开发;生产环境应使用 gin.new() 自定义中间件以提升可控性与性能。

gin.Default() 和 gin.New() 的区别到底在哪
别直接用 gin.Default() 就以为万事大吉——它默认加载了 gin.Logger() 和 gin.Recovery() 两个中间件,适合开发调试,但上线后日志量大、 Recovery 捕获 panic 后不透出堆栈,排查问题反而更难。
-
gin.Default()=gin.New()+Use(Logger(), Recovery()) - 生产环境建议用
gin.New(),自己按需加中间件:比如只加Recovery(),日志改用结构化 logger(如 zap)单独注入 - 本地调试时,
Logger()输出的请求耗时、状态码很直观;但高并发压测下,它本身会成为性能瓶颈 - 如果你禁用
Recovery(),panic 会直接导致服务退出——这在容器环境里会触发重启,但至少错误现场没被吞掉
路由参数 c.Param()、c.Query()、c.PostForm() 别混用
这三个方法对应完全不同的数据来源,拿错就返回空字符串或 panic,而且 Gin 不做类型校验,运行时才发现。
-
c.Param("id")只取路径里的命名参数,比如/user/:id中的id,URL 是/user/123才能取到"123" -
c.Query("page")取 URL 查询参数,/list?page=2&size=10→"2";重复 key 只返回第一个值,要全取得用c.Request.URL.Query()["page"] -
c.PostForm("name")专用于application/x-www-form-urlencoded表单,对 JSON 请求体完全无效;JSON 得用c.ShouldBindJSON(&struct{}) - 如果路径是
/user/:id/info,又带查询参数?format=json,那c.Param("id")和c.Query("format")必须分开调,不能指望一个方法覆盖全部
r.Run() 默认监听 0.0.0.0:8080,但别在生产环境裸跑
r.Run() 看似方便,实则绕过了很多关键控制点:无法设置超时、无法复用已有 *http.Server、无法优雅关闭、也不能绑定 Unix socket 或 TLS。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 启动时没传地址,默认监听
0.0.0.0:8080,意味着所有网卡都暴露——Docker 容器里可能意外暴露给宿主机外网 - 想加读写超时?得自己构造
*http.Server:srv := &http.Server{Addr: ":8080", Handler: r, ReadTimeout: 5 * time.Second} - 要支持 HTTPS?不能只靠
r.RunTLS(),得提前准备好证书文件路径,且该方法不支持 Let's Encrypt 自动续签 - 进程退出前必须调
srv.Shutdown(),否则正在处理的请求会被粗暴中断;Gin 自己不管理这个生命周期
中间件顺序错了,后续 handler 根本收不到请求
Gin 的中间件是链式执行的,next() 调用的位置决定控制流走向。漏写、错放、提前 return,都会让请求在中途“消失”。
- 鉴权中间件里判断 token 失效后,必须显式写
c.Abort()并返回响应,否则next()还是会往下走 - 日志中间件放在最后(即
next()之后)就只能打到耗时,打不到状态码——因为 handler 已经写完 response header 了 - 跨域中间件
cors.Default()必须放在路由注册之前,否则 preflight OPTIONS 请求根本进不来 - 自定义中间件里如果用了
c.Set("key", value),下游 handler 要用c.MustGet("key")取,c.Get()返回的是interface{}+bool,容易忽略第二个返回值导致空指针
真正麻烦的不是语法记不住,而是那些没报错、却悄悄改变行为的细节:比如 gin.Default() 默默加的日志,c.Query() 对空参数的静默容忍,还有 r.Run() 背后缺失的连接管理能力。这些地方不亲手踩一遍坑,文档根本不会提醒你。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










