在 Gin v1.12.0 里实测 HTML 模板:release 模式启动时解析一次,debug 模式每次渲染重新解析(1.7 µs 对 119.5 µs);自动转义与 template.HTML;不同目录下的同名文件互相覆盖;模板不存在时返回 200 加空正文,渲染中途出错会发出半截页面;SetFuncMap 要在 LoadHTMLGlob 之前。
在 Gin v1.12.0 里实测流式响应:c.Stream 每步都 Flush,事件按 200 ms 间隔即时到达;循环里只 SSEvent 不 Flush 时 4 个事件在 806 ms 一起到达;SSEvent 的原始格式与响应头(nil 会写成 data:<nil>);客户端断开后 step 还会多调用 1 次;step 不阻塞会在 100 ms 内空转约 191 万次。
在 Gin v1.12.0 里实测静态文件服务:Static 不列目录(没有 index 的目录是 404 加空页);点文件 .env 和指向根目录之外的符号链接都会被直接提供;10 种路径穿越写法全部 404;Last-Modified 有而 ETag 没有;Static("/") 与同级路由冲突会 panic。
在 Gin v1.12.0 里实测文件下载:c.File 就是 http.ServeFile,支持 Range(单段 206、多段 multipart/byteranges、越界 416)与 If-Range;c.Data 没有 Range;FileAttachment 对非 ASCII 文件名把空格编码成 +;c.File 拼接查询参数能读到根目录之外的文件;200 MiB 文件 c.File 只分配 0.7 MiB。
在 Gin v1.12.0 里实测 Logger 中间件:默认格式的每一段和耗时截断规则;完整查询串(含令牌)被写进日志;耗时只从 Logger 开始计到 c.Next() 返回;ForceConsoleColor 的 ANSI 转义;SkipPaths / Skip / SkipQueryString / 自定义 Formatter;Recovery 放在 Logger 外面时 panic 的请求没有访问日志;Logger 一个请求约 800 ns。
在 Gin v1.12.0 里实测 Recovery:panic 之后客户端是 500 加空正文,日志带栈,引擎继续服务;debug 模式多出请求转储但只给 Authorization 打码(Cookie、X-Api-Key 原样出现);恢复函数收到 panic 的原值(包括 panic(nil) 的 *runtime.PanicNilError);EPIPE / ECONNRESET / http.ErrAbortHandler 走断管分支,不记栈、不调自定义函数。
在 Gin v1.12.0 里实测 debug 与 release 的差异:代码里只有三类判断(debugPrint 输出、HTML 模板热加载、Recovery 的请求转储);同一个程序 debug 输出 16 行、release 只有 2 行;SetMode 覆盖环境变量,非法值 panic,go test 里未设置时也是 debug;命中路由的耗时没有区别。
在 Gin v1.12.0 里实测 ClientIP:默认信任所有代理,直连客户端伪造 X-Forwarded-For 就能指定 ClientIP;SetTrustedProxies 后从右往左跳过受信任代理、不受信任的远端头被忽略;RemoteIPHeaders 与 ForwardedByClientIP 的作用;TrustedPlatform 的头不做任何校验,原样返回。
在 Gin v1.12.0 里实测 BasicAuth:账号预先算成 "Basic base64" 头值,整串做常量时间比较,所以小写 scheme、多余空格、去掉 = 填充都是 401;失败返回 401 与 WWW-Authenticate,BasicAuthForProxy 返回 407;组里的 404 不要求认证;每个请求遍历全部账号,1000 个账号时长度相同的错误凭据 14.4 µs、长度不同只要 1.56 µs。
在 Gin v1.12.0 里实测超时控制:http.TimeoutHandler 100 ms 后客户端得到 503,但 handler 继续跑到 303 ms;用 context 超时并让 handler 配合则 104 ms 就能结束;不检查 context 的 handler 照常跑完;WriteTimeout 让客户端等 301 ms 后 EOF;r.Run 创建的 http.Server 没有任何超时,发一半请求头的连接 1.5 秒仍不被关闭。
在 Gin v1.12.0(配合 net/http)里实测优雅关机:Shutdown 立刻拒绝新连接、等在途请求,但返回时间会因轮询间隔晚最多约 500 ms;ctx 到期不会中止请求;长连接要用 BaseContext + RegisterOnShutdown 通知;被 Hijack 的连接不归它管;真实进程里 r.Run 收到 SIGTERM 在 2 ms 内被杀,优雅关机则等到在途请求结束。
在 Gin v1.12.0 里实测协议与监听方式:UseH2C 开启才支持 curl --http2-prior-knowledge(同端口 HTTP/1.1 并存);RunTLS 下 curl 协商出 HTTP/2(ALPN h2,TLS 1.3),TLS 1.1 被拒;HTTP/2 下 Hijack 会 panic;证书缺失立刻返回错误;RunUnix 上 ClientIP 一律信任转发头,无头时是 "<nil>",被信号杀死会残留 socket 文件。