Go语言技术文章
-
用 iter.Pull 把 Go 的 iter.Seq 转成 next/stop 拉取式接口,说明按需读取、正常结束、提前停止、Pull2 和并发调用的边界。217 收藏 -
Go 的 iter.Seq 用 yield 回调交付序列元素,以布尔返回值约定是否继续。本文通过只取前三个编号的示例,说明按需生成、提前停止、资源清理与重复遍历的职责,并区分惰性、缓存和并发。393 收藏 -
使用 slices.IndexFunc 按谓词查找切片的首个匹配元素,重点说明索引返回值、未命中时的 -1,以及空切片的安全处理。142 收藏 -
Go 1.23 起可以用 slices.Chunk 把切片按固定大小分成连续子切片并直接遍历。本文说明最小写法、尾块、空输入、非法 n、底层数组关系,以及旧版本 Go 的兼容实现。498 收藏 -
Go 使用 slices.Compact 原地合并相邻重复元素时,应接住返回切片并停止使用旧长度视图。本文说明相邻去重、共享底层数组与容量的区别,梳理 Go 1.22 尾部清零变化及保留输入的写法。342 收藏 -
用 maps.EqualFunc 比较两个 map 时,键仍按 == 判断,值则交给自定义函数处理。本文从跨类型值、大小写规则、缺键与 nil map 讲清 API 边界,并给出生产代码选型清单。118 收藏 -
Go 用 atomic.Bool 表示一次性状态时,核心是让所有调用共享同一个对象,并用 CompareAndSwap(false, true) 竞争唯一成功者。本文区分 Load、Store、Swap 和 CompareAndSwap 的边界,说明重复调用、重置、复制和多字段一致性问题。448 收藏 -
用 Go 标准库 maps.Clone 复制 map,区分 map 容器独立与切片等 value 仍共享底层数据的边界,并给出可验证的复制方案。410 收藏 -
用 sync/atomic.Pointer 原子发布完整的 Go 配置快照,说明 Store、Load、Swap 与 CompareAndSwap 的区别,以及为什么发布后不能原地修改配置对象。446 收藏 -
围绕 sync.Pool 的临时对象语义,说明 New、Get、Put、Reset 和对象所有权边界,解释为什么 Pool 不能保存业务状态、不能依赖命中率与取出顺序,并给出缓冲区复用与方案选型示例。162 收藏 -
Go 的 sync.Cond 不负责保存通知,真正需要等待的是受锁保护的共享谓词。本文从丢失唤醒的症状出发,说明为什么必须用同一把锁配合 for 循环检查条件,并给出 Signal 与 Broadcast 的选择方法。143 收藏 -
Go x509 的 SetFallbackRoots 用于系统根证书池不可用时的兜底配置。本文说明 CertPool 构造、显式 Roots 优先级、nil 与重复调用边界,以及 GODEBUG 排查方式。397 收藏 -
使用 Go sync.OnceValue 缓存一次计算值,排查重复创建 getter、初始化阻塞与可变返回值共享问题,并说明 panic、零值和缓存生命周期的注意点。103 收藏 -
Go context.WithoutCancel 可以保留请求范围内的值,却不继承父上下文的取消信号。本文对比 Value、Done、Deadline、Err 和 Cause,并给出脱离请求后重新设置独立超时的写法。458 收藏 -
Go 的 ctx.Err() 适合判断 Canceled 和 DeadlineExceeded,context.Cause(ctx) 则能在设置取消原因后保留更具体的根因。本文用父子 Context、主动取消和超时三个场景说明两者如何配合。255 收藏