Go问答技术文章
-
Go 项目存在 vendor 目录却在构建时找不到模块,通常与主模块根目录、go.mod 版本条件、vendor/modules.txt 不一致或依赖未被收集有关。本文给出从定位主模块到选择 -mod 模式的排查路径。459 收藏 -
Go trace 文件过大通常与记录窗口太长、运行时事件密度高或用户标记过多有关。本文说明如何用短窗口、任务边界和 FlightRecorder 保留可分析的诊断片段,并区分 trace、pprof 与业务日志的分工。173 收藏 -
Go pprof CPU 图没有业务函数,通常不是 pprof 失效,而是采样窗口没有覆盖业务 CPU、符号化没有拿到匹配二进制,或过滤参数把业务节点隐藏。本文按资产、风险链路和复查动作给出排查顺序。243 收藏 -
Go 加上 -race 后变慢,主要来自访问插桩、同步关系跟踪和额外历史内存。本文说明如何固定 workload 比较性能,并用 GORACE 控制报告边界。469 收藏 -
Go benchmark 第一次结果特别慢时,先区分一次性初始化和被测操作,再用 ResetTimer 或 B.Loop 管理计时边界,避免把准备成本误判为性能回归。246 收藏 -
Go test -run 匹配的是测试名称而非文件名。通过包范围、正则锚点和子测试层级解释未执行现象,并区分缓存、跳过、未匹配与构建失败,给出准确命令及独立示例。124 收藏 -
Go httptest 默认使用系统选择的回环端口;出现端口被占用时,重点检查是否通过 -httptest.serve 或自定义 Listener 固定了地址,以及测试结束是否调用 Close。111 收藏 -
Go t.Parallel 本身不是随机失败的根因,真正危险的是并行测试共享了会变化的进程级状态。本文从生命周期、共享资产和隔离策略入手,给出可重复排查清单。124 收藏 -
WaitGroup 只等待对应任务计数归零,不自动等待消费者或刷新缓冲。文章区分 Add 过晚、Done 过早、异步写入遗漏与 Flush 边界,给出独立结果槽和生产消费两种同步方案。448 收藏 -
Go 同包测试运行在同一个测试进程里,包级可变变量会被前一个测试留下的状态影响。本文区分普通测试、子测试、t.Parallel、TestMain 与测试缓存的边界,并给出保存恢复和工厂函数两种隔离写法。156 收藏 -
Go slog.Record 是值类型,但直接复制时可能共享属性切片的底层数组。本文解释 Record.Clone 如何隔离后续 AddAttrs 修改,并给出异步 Handler 传递日志记录时的安全写法。301 收藏 -
Go errgroup 首个错误后其他任务仍运行,通常不是取消失效,而是 worker 没有监听派生 Context,或使用了零值 Group。本文拆开错误传播、取消信号与 Wait 收敛的边界,并给出可协作退出的代码结构。141 收藏 -
Go goroutine 泄漏后不会被 GC 自动结束,通常是 channel、锁、WaitGroup 或 I/O 缺少可达的退出条件;本文从阻塞栈定位并用 context、关闭 channel 和 WaitGroup 修复。220 收藏 -
Go JSON 解码遇到类型不匹配时,利用 json.UnmarshalTypeError 的 Value、Type、Field 和 Offset 字段定位具体问题,区分语法错误、字段映射和部分成功结果。250 收藏 -
Go context 取消后任务仍在运行,通常不是 cancel 失效,而是 goroutine 没有监听 Done、阻塞调用没有接收 context,或收尾阶段被结果通道卡住。本文用循环、数据库调用和排查清单拆开这条边界。244 收藏