-
sync.Map 并不保证在所有并发读写场景都快于 map 加 RWMutex。本文从读写比例、键集合和更新竞争三个维度构造最小 benchmark,解释性能没有达到预期时如何定位并选择实现。
-
Go 使用 context.WithCancel 后 goroutine 仍不退出,通常是 worker 没有监听 ctx.Done 或底层调用不可取消。本文按取消传播、worker 改写和依赖调用三个层次说明排查与修复边界。
-
Go 的 http.Header 是 map[string][]string,直接赋值或只复制 map 仍可能共享值切片。本文从旧写法的串改问题出发,说明 Header.Clone 的隔离语义、nil 与多值边界,以及从手写复制迁移到 Go 1.13+ 标准方法的检查清单。
-
Go 1.27 的 testing/synctest.Sleep 不只是等待虚拟时间,还会等 bubble 内其它 goroutine 稳定阻塞。本文解释只写 time.Sleep、未进入 bubble、使用真实网络或没有清理后台任务时为什么仍会不稳定,并给出按版本选择的最小写法。
-
atomic.Pointer[T] 中的 T 决定了它保存的指针类型以及 Store、Load、Swap 和 CompareAndSwap 的参数与返回值。本文解释 Go 为什么要求指针类型一致,并给出共享配置对象的安全用法与复制、可变性边界。
-
使用 Go runtime/metrics 读取 runnable、running、waiting 与 live goroutine 指标,区分近似值和总量,并用连续采样判断运行队列压力,避免把单次高点误判为泄漏或根因。
-
Go testing.T.Failed 返回当前测试是否已经失败,适合放在 t.Cleanup 中做最终诊断或选择性保留现场。本文说明它与 t.Error、t.Fatal、t.Run 返回值、子测试状态和 Skipped 的边界。
-
reflect.TypeOf 读取的是接口值的动态类型。传入真正的 nil 接口时没有动态类型,因此返回 nil;本文结合 typed nil、TypeFor 和 ValueOf 说明反射代码的安全判断方式。
-
Go exec.Cmd 同时读取 stdout 和 stderr 时,单路读取或提前 Wait 容易造成阻塞。本文解释 StdoutPipe、StderrPipe 与 Wait 的边界,并给出简单收集和并发分流两种处理方式。
-
Go 中 defer 只能在所属函数返回时执行清理,不能自动停止另一个 goroutine。本文用 context.Done、显式 cancel 和 WaitGroup 拆开取消信号、worker 退出与资源回收三个职责,说明周期任务和阻塞调用的排查边界。
-
Go 的 exec.Cmd.Env 遇到同名环境变量时,最终采用切片中最后出现的值。本文区分 nil 继承、显式环境、Cmd.Environ 追加覆盖、空值与 Windows 特殊边界,给出可直接套用的构造方式。
-
Go 模板 Execute 返回错误时,已经写入 ResponseWriter 的部分正文不会自动回滚。本文解释错误来源,展示先写入 bytes.Buffer、成功后再提交 HTTP 响应的处理方式,并说明状态码、日志和写出错误的边界。
-
Go encoding/xml 遇到 XML 前缀从 p 变成 ns 后匹配失败时,应比较命名空间 URI 与本地名,而不是比较短前缀。本文用 xml.Name、XMLName 标签、DefaultSpace 和最小回归样例说明排查与修复边界。
-
Go GOPROXY 返回 404 时,先不要急着更换代理。本文从模块路径、主版本后缀、可用版本列表、代理回退规则和私有模块配置五个方面定位问题,配合 go list -m -versions 与 go mod download 找到真正缺失的是路径、版本还是来源。
-
Go replace 的本地目录替换不会随依赖库自动传递。结合应用与库发布场景说明主模块作用域、工作区掩盖、版本迁移和独立消费者检查。