Go语言技术文章
-
Go sync.Map 并不是所有并发 map 的默认替代品。本文从只写一次多次读取、互不重叠键集合两个官方优化场景出发,结合 LoadOrStore 示例说明它和 map 加 RWMutex 的取舍,以及 Range、类型安全和复制限制。135 收藏 -
Go 升级后 context.Cause 返回值变化,先不要把它当成标准库回归。应按构造函数、首次取消时机、父子 Context 和错误身份四层排查,区分 ctx.Err 的取消状态与 Cause 的具体原因。135 收藏 -
unique.Make 没有缓冲区参数。本文用 Go 逐行标签程序说明如何复用 Scanner 缓冲、转换稳定字符串并保存句柄,区分值去重与记录去重,同时解释输入限制、生命周期和性能判断边界。134 收藏 -
slices.Delete 不负责缩小底层数组或关闭文件等资源。本文区分返回值、Go 1.22 起的尾部清零、容器复制、其他引用与 Close 所有权,给出可选收缩的原创示例。134 收藏 -
go mod tidy 在本地与 CI 反复修改模块文件时,如何对齐实际工具链与源码输入,识别测试及标签依赖,并区分 go.mod 和 go.sum 的变化原因。133 收藏 -
Go database/sql 不能把 SQL NULL 直接扫描到 string。本文说明 NULL、空字符串和默认文本的区别,并比较 sql.NullString、*string 与 COALESCE 的适用边界。130 收藏 -
先处理 WalkDir 回调错误再访问目录条目,用完整只读统计工具区分根失败、子目录权限遗漏和主动排除,并解释 SkipDir、部分结果与退出状态。130 收藏 -
Go 计算文件 SHA-512 摘要时,优先用 crypto/sha512.New 配合 io.Copy 流式读取,再将 64 字节结果编码成 128 位十六进制文本。本文给出完整实现、摘要比较方式和文件变化、空文件与算法选择的边界。128 收藏 -
Go x/sync/errgroup.SetLimit 可以把活动 goroutine 数量限制在指定上限。本文从批量任务的实际场景出发,说明 SetLimit 与 Go、TryGo、WithContext 和 Wait 的配合方式,以及限制值、错误取消和任务提交时机的边界。127 收藏 -
Decoder 不负责关闭底层 Reader。通过文件与响应体的所有权、单文件函数和长期引用,区分句柄泄漏、缓冲保留与业务结果增长,并给出读取示例和指标比较方法。126 收藏 -
slices.Compact 会在原有切片上合并连续重复元素并返回缩短后的切片。本文说明如何接住返回值、判断底层缓冲是否复用,以及指针元素和容量边界的处理方式。125 收藏 -
Go 先用 filepath.EvalSymlinks 检查,再调用 os.Open,仍可能因检查与使用之间的 TOCTOU 竞态打开意外文件。本文区分 IsLocal、EvalSymlinks 与目录根约束,并给出 Go 1.24+ 的 os.OpenInRoot、os.Root 迁移写法。124 收藏 -
Go 1.20 起普通接口可满足 comparable,但受 any 约束的类型参数、附加方法与不可比较动态值仍有不同边界。结合集合示例区分编译错误、运行时风险与业务键设计。123 收藏 -
本文围绕 slices.Compact 解释如何判断输入是否满足使用边界:识别连续重复、空切片、单元素和非连续重复,并说明返回长度、底层数组复用与尾部清零的影响。123 收藏 -
Go工具链升级后出现编译、测试或运行行为变化时,固定源码和依赖,用新旧工具链建立对照,区分模块声明、兼容默认值与环境差异,并保存可复现的定位记录。122 收藏