跳转到主内容
极星编程网:以代码为星,赴技术山海!

Go语言Gin框架快速入门_Golang高性能Web框架使用教程

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。 启动时没传地址,默认监听
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,都会让请求在中途“消失”。 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 失效后,必须显式写
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()
背后缺失的连接管理能力。这些地方不亲手踩一遍坑,文档根本不会提醒你。

相关文章