Go语言技术文章
-
Go 测试断言抽成辅助函数后,t.Helper 如何让失败行号回到测试调用点,以及多层断言包装该怎样逐层标记。283 收藏 -
sync.OnceFunc 的 panic 不是一次性失败后自动重试,而是被缓存并在后续调用中用同一个值再次 panic。本文拆解实现状态、栈信息差异和可重试初始化的替代写法。249 收藏 -
讲清 Go sync.Cond 的可靠等待写法:为什么 Wait 返回后必须用 for 重新检查共享条件,如何配合 Locker 实现有界条件队列,以及 Cond、channel、Mutex 的选型边界。328 收藏 -
用 Go 的 atomic.Bool 实现并发开关,掌握 Load、Store、Swap、CompareAndSwap 的选择,以及原子状态与配置可见性的边界。257 收藏 -
Go 泛型约束中的 ~T 表示底层类型为 T 的类型集合。本文用 UserID、类型别名和联合约束说明 ~int 的匹配范围,并解释 ~MyInt、重叠集合与非基本接口为什么会编译失败。168 收藏 -
Go 原生 fuzz 测试的可复现性取决于 seed corpus 管理。本文区分 F.Add、testdata/fuzz 和 GOCACHE/fuzz,说明如何保留固定边界样例、沉淀失败输入并用 go test 稳定回放。389 收藏 -
用 Go testing.T.Deadline 取得测试总截止时间,在昂贵准备前判断剩余预算,并通过 context.WithDeadline 让可取消的准备工作及时停止。107 收藏 -
用 Go atomic.Pointer[Config] 发布不可变配置快照,说明 Store、Load、切片复制、map 隔离和多字段一致性的工程边界。334 收藏 -
Go 1.20 之后接口类型可以满足 comparable 约束,但接口值仍可能因动态值不可比较而 panic。本文用类型集合、严格可比较和泛型调用示例拆清这个边界。454 收藏 -
Go 1.19 及以上项目通常优先使用 atomic.Int64;兼容旧版本或已有 *int64 接口时继续使用旧式原子函数。本文从 API 形状、计数器迁移、版本、对齐和复制约束说明如何选择。130 收藏 -
同一个 Go 服务进程也能按租户切出 CPU 采样上下文。本文用 pprof.Do 和 pprof.Labels 说明标签写入、goroutine 继承、同名覆盖及高基数边界。404 收藏 -
Go 的 trace.NewTask 适合标记会跨多个 goroutine 接力完成的逻辑操作。本文用一个并发汇合示例说明如何传播任务 Context、安排 Task.End,并用 Region 和 Log 补足阶段信息。208 收藏 -
Go 服务需要持续观察 goroutine 数量、调度队列和等待延迟时,可以使用标准库 runtime/metrics,而不必依赖 pprof。本文从 All 和 Read 的采样入口讲到 Value.Kind、计数值与直方图处理,并说明两者在生产观测中的分工。214 收藏 -
Go sync.Map.Range 能安全地遍历并发 Map,却不保证一次一致快照。本文从线上统计读数漂移切入,解释并发 Store/Delete 的影响、回调边界和需要快照时的替代方案。428 收藏 -
Go context.AfterFunc 适合绑定超时、上游取消等退出路径的补偿清理。本文用连接读截止时间示例说明 stop 返回值、清理完成同步、幂等和正常完成路径的边界。375 收藏