Go问答技术文章
-
Go benchmark 结果波动时,先划清 b.N 的计时边界,再用 ResetTimer、benchmem、allocs/op、B/op 和 AllocsPerRun 判断分配是否真的影响了结果。152 收藏 -
普通测试单线程运行正常,并不代表 Go 程序没有数据竞争。本文用共享计数器说明调度差异,演示 go test -race 的最小复现、报告定位和原子操作、互斥锁的修复边界。366 收藏 -
Go runtime/trace 文件变大,通常不是压缩工具的问题,而是采集窗口覆盖了太长时间。本文用 trace.Start/Stop 缩短一次操作的采集范围,并介绍 Go 1.25+ FlightRecorder 的 MinAge、MaxBytes 与 WriteTo 用法。120 收藏 -
Go pprof 看不到热点时,先确认 CPU profile 类型和业务负载是否覆盖目标路径,再用 seconds 拉长采样窗口,最后结合 top、list、flat 和 cum 判断样本是否足够。122 收藏 -
Go slog 的 WithAttrs 属性没有出现在文本输出时,先区分整条日志被级别过滤,还是字段被 ReplaceAttr 或自定义 Handler 丢弃。本文用标准 TextHandler、包装 Handler 和分组检查清单定位问题。167 收藏 -
Go 的 net.Resolver 与 getent、dig、nslookup 可能走不同解析路径。本文用 GODEBUG、hosts/NSS、resolv.conf 和自定义 Resolver 分层定位差异,并给出可复查的修复方式。170 收藏 -
Go TLS 握手失败时,先分开检查 TCP 连接地址、ServerName/SNI 和证书 SAN,再用 HandshakeContext 固定错误点、用 ConnectionState 读取证书链,最后在服务端记录 ClientHelloInfo.ServerName 定位虚拟主机选证书问题。397 收藏 -
Go CookieJar 不保存服务端 Cookie,常见原因不是 Set-Cookie 消失,而是 Client 没有配置 Jar,或 Cookie 的域名、路径、Secure、过期时间与下一次请求 URL 不匹配。本文给出一套可复用的排查和修复写法。426 收藏 -
Go 的 301、302、303 重定向会把 POST 改成 GET;本文解释 307/308、GetBody 与 CheckRedirect 的关系,帮助你避免请求体丢失和重复提交。216 收藏 -
Go 处理 gzip 时要同时限制压缩输入和解压输出。本文用 io.LimitReader(maxOutput+1) 识别超限,并说明多成员、EOF、校验和与资源释放边界。498 收藏 -
Go 解包 tar 时,先把 Header.Name 当成不可信输入,拒绝绝对路径、.. 路径和链接条目,再用 filepath.IsLocal 与 filepath.Rel 把目标限制在根目录内;词法检查通过后仍要单独考虑符号链接和文件系统竞态。286 收藏 -
filepath.Clean 只做路径字符串的词法规范化,不能判断用户是否有权访问某个目录。本文用 Go 示例拆开 Clean、Rel、IsAbs 与符号链接检查的边界。437 收藏 -
Go 的 os.Rename 遇到跨文件系统路径时可能返回 invalid cross-device link。稳妥做法是在目标目录创建临时文件,用 io.Copy 完成复制并关闭后,再在目标文件系统内 Rename,最后成功才删除源文件。313 收藏 -
Go 文件写入时,Close 可能暴露延迟错误。本文解释如何保留 Write、Flush、Sync、Close 的错误,并给出 errors.Join 实现。235 收藏 -
使用 Go exec.Cmd.StdoutPipe 时,先 Wait 后读取可能在长输出场景阻塞。文章解释管道容量、子进程写端与父进程读端的关系,并给出单管道、双管道和直接缓冲输出的正确顺序。259 收藏