Go问答技术文章
-
高频循环里反复调用time.After会让计时器无法主动取消。本文用可复用的time.NewTimer演示Stop、排空、Reset和退出清理,并说明Go 1.23前后的Timer语义差异。481 收藏 -
Go 的 ZIP 压缩包可能只有文件条目而没有对应目录条目。本文用 archive/zip 说明如何按 FileHeader.Name 识别显式目录,从文件路径补齐隐式目录,并处理 File.Open 的资源关闭与路径安全边界。181 收藏 -
Go archive/tar 读取中文文件名乱码时,先区分 PAX/USTAR 的格式能力与旧系统字符集转换,再用 UTF-8 校验、明确编码转换和跨工具样本测试稳定处理。244 收藏 -
Go 程序里的相对路径不是相对源码目录,而是相对进程当前工作目录。本文按 os.Getwd、filepath.Abs、显式配置根目录和部署检查清单的顺序,定位 IDE、测试、脚本与服务启动时的路径失效问题。401 收藏 -
围绕 Go log/slog 中 nil 属性、空组和缺失键的差异,比较 TextHandler 与 JSONHandler 的输出,并给出 typed nil 和生产日志字段的排查方法。276 收藏 -
Go fuzz 测试遇到 []byte 被修改、后续用例结果漂移时,关键是建立输入所有权:保留原始快照,把可变操作放到独立副本上,并检查返回切片与缓存是否复用底层数组。315 收藏 -
Go 测试提前 Fatal 时,已注册的 t.Cleanup 仍会在测试边界执行。本文梳理后进先出、父子测试资源归属,以及异步 goroutine 错误回传的安全写法。399 收藏 -
Go 测试中 t.Parallel 与 t.Setenv 不能直接混用。本文用串行父级、配置注入和串行分组三种组织方式,解决全局环境变量影响并行子测试的问题。265 收藏 -
Go context取消后下游循环仍运行,通常是阻塞调用、channel边界或context传递链没有覆盖。本文按检查清单定位取消信号、补齐退出分支,并区分协作式取消与等待goroutine结束的边界。175 收藏 -
从 goroutine 堆栈定位 Go 结果 channel 的 chan send 阻塞,区分无缓冲、满缓冲和 nil channel,并用 context、select、WaitGroup 补齐接收、取消与关闭路径。292 收藏 -
Go 结构体含 sync.Mutex 时,值接收者、参数传递、range 和 map 取值都可能复制锁。本文对比指针语义、快照边界与 go vet copylocks 的审查方法。431 收藏 -
Go 中用 sync/atomic 保护变量时,若另一条路径仍然普通读写,同一地址依旧可能产生数据竞争。本文给出按访问清单定位、统一同步模型、迁移字段、检查边界和 race 回归的修复步骤。289 收藏 -
Go sync.Pool取回旧对象时,问题通常来自复用对象没有建立完整的初始化协议。本文从Get后的重置、Put前的所有权检查和并发排查三个方面说明如何消除残留状态。327 收藏 -
Go append 是否改到原切片,关键看两个切片是否共享底层数组以及剩余容量。本文用 len、cap、三索引切片和 slices.Clone 给出判断与隔离方法。407 收藏 -
Go copy返回值偏小时,先看目标切片的len而不是cap。本文用代码和表格说明copy的可见范围、容量扩展方式、重叠复制与空切片边界。246 收藏