Go问答技术文章
-
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 收藏 -
Go select 一旦加入 default,在所有通信都未就绪时就会立即返回;如果它被放进无条件 for 循环,循环会反复检查而形成忙等。本文解释选择规则,并给出阻塞等待、ticker 和退避三种改法。431 收藏 -
Go 的 URL.Path 保存解码后的路径,RawPath 只是可选的原始编码提示;需要重建请求或保留 %2F 等编码差异时,应优先调用 EscapedPath、String 或 RequestURI。250 收藏 -
Go atomic.Value.Swap 会把新值写入原子容器并返回替换前的值;首次调用返回 nil,但新值不能为 nil,后续调用还必须保持同一具体类型。本文用配置快照场景说明如何安全接住旧值并处理边界。334 收藏 -
sync.Once 保证回调只执行一次,并不保证执行到成功。文章区分永久保留首次结果、启动初始化与成功缓存,给出互斥保护的可重试配置示例,并说明取消等待、重试频率和资源生命周期的限制。229 收藏 -
Go sync.Pool 中对象放入后很快消失并不一定是并发错误,本文解释临时复用池的生命周期边界,并比较 Pool、带锁 map 与有界 channel 的适用场景。139 收藏