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