Go问答技术文章
-
Go io/fs返回的错误通常带有PathError上下文,使用errors.Is区分文件不存在、权限拒绝和非法路径,再把每类错误映射到明确的业务动作。259 收藏 -
Go 反射中直接调用 reflect.Value.Elem 可能因 zero Value、nil interface 或错误 Kind 触发 panic。本文用 IsValid 与 Kind 建立安全解引用边界,并给出可复用的错误返回写法。377 收藏 -
讲清 Go errors.Join 组合错误的树形关系,以及如何用 errors.Is 和 errors.As 保留单项错误匹配、类型提取和边界判断能力。374 收藏 -
高频循环里反复调用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 收藏