Blog
从 happens-before 真正理解 Go 内存模型
用 happens-before 统一解释 goroutine、Channel、Mutex、Once 和 atomic 的内存可见性,避免依赖调度时序。
2026年6月25日
结构化并发:WaitGroup、errgroup 与并发任务收敛
让并发任务的生命周期服从调用栈:比较 WaitGroup 与 errgroup,处理错误、取消、并发上限和结果收集。
2026年6月23日
控制并发而不是制造 Goroutine:Worker Pool、信号量与背压
从容量规划出发设计并发上限、队列和背压,比较 Worker Pool、Channel Semaphore 与 errgroup.SetLimit。
2026年6月22日
构建不泄漏的并发流水线:Fan-out、Fan-in 与取消
从 Stage 所有权、Fan-out/Fan-in 和提前退出入手,构建能够传播取消、关闭有序且不会阻塞泄漏的 Go 流水线。
2026年6月21日
定时器的坑:Timer、Ticker、time.After 与重置语义
结合 Go 1.23 之后的新 Timer 语义,解释一次性超时、循环复用、Ticker 停止、AfterFunc 与可测试时间设计。
2026年6月20日
写对一个 Go HTTP 服务:超时、Context、连接复用与优雅停机
从服务端四类超时、请求 Context 和客户端连接池出发,构建能够正确限流、取消并优雅停机的 Go HTTP 服务。
2026年6月19日
JSON 边界上的坑:零值、nil、omitempty、数字精度与未知字段
围绕缺失、null 与零值的语义差异,解决 JSON 集合、omitempty、PATCH 三态、数字精度和严格解码问题。
2026年6月16日