Go语言技术文章
-
Go sync.Cond 的关键不是把 Signal 换成 Broadcast,而是让等待条件、互斥锁和唤醒范围保持一致。本文从有界队列场景出发,拆解 Wait 的循环写法、Signal 与 Broadcast 的选择、丢唤醒风险和可验证的测试边界。104 收藏 -
Go 测试里 t.Setenv 会注册环境变量清理动作,但它不能与 t.Parallel 放在同一测试流程中。本文用最小示例说明限制原因、子测试边界和稳定的隔离写法。429 收藏 -
Go 的 os.File.Sync 不是每次写文件都要调用的性能开关,而是把关键写入推进到存储设备可恢复边界的明确步骤。本文用临时文件、文件同步、原子替换和目录同步拆开它的适用场景、错误处理与验收方法。300 收藏 -
sync.Map.Range 适合做并发遍历,但不能当作一致性快照。本文用一个在线会话统计场景拆开 Range 的遍历语义、并发写入影响、O(N) 成本,并给出快照统计与可控停止的实现边界。298 收藏 -
slog.Handler 的 WithAttrs 不只是把字段拼到日志里:实现自定义 Handler 时,属性如何分组、何时复制、如何保证并发安全,都会影响分配次数和输出一致性。本文用一个可运行的 Handler 说明这几个边界。231 收藏 -
用 Go runtime/trace 的 Task、Log 和 Region 标记一次异步请求,把采集、查看与代码验证串起来,帮助定位跨 goroutine 的阶段耗时和事件顺序。244 收藏 -
context.AfterFunc 的停止函数只负责阻止尚未开始的回调;一旦回调已经启动,调用 Stop 不会等待它结束。本文用可复现代码拆开停止竞态、资源释放和幂等收尾。332 收藏 -
Golang · Go问答 | 3天前 | golang · 数据库 · 工程实践 · database/sql · Go 数据库驱动 database/sql Rows.NextResultSet 多结果集
当一条数据库语句返回多个结果集时,Rows.Next 只会遍历当前结果集,必须配合 NextResultSet 切换到下一组数据。本文用可复现的 database/sql 代码说明遍历顺序、Err 检查和驱动兼容边界。439 收藏 -
当 errors.Is 判断包装错误失效时,先区分单链 Unwrap 与 errors.Join 的多链展开,再用可复现代码检查哨兵错误是否仍在错误树中。本文从一个接口报错现场出发,给出定位、修复和边界验证方法。275 收藏 -
json.Decoder.Decode 成功一次,不代表请求体只包含一个 JSON 文档。本文用 Token、第二次 Decode 和 io.EOF 判定尾随数据,拆解单文档接口的校验边界与常见误区。494 收藏 -
io/fs.ValidPath 专门判断文件系统接口使用的相对路径是否合规。本文从点号、斜杠、空路径和归档条目四个边界入手,给出可运行的校验代码以及如何避免把合法嵌套路径误判成危险输入。408 收藏 -
Go 的 html/template.ParseFS 可以直接从 embed.FS 加载模板,但嵌入路径、模板匹配和执行错误各有边界。本文用一个可运行的页面渲染例子拆开加载、执行、错误定位与发布验收。417 收藏 -
Go 的 os.ReadDir 返回 DirEntry,不必立刻为每个目录项读取完整 FileInfo。本文拆开 Type、IsDir、Info 的成本和错误边界,说明排序语义、符号链接判断以及适合目录扫描的最小写法。325 收藏 -
Go 标准库 flag 默认把一个参数当成一个值。本文用自定义 flag.Value 收集重复参数,说明切片初始化、空值校验、错误提示和最终读取的边界。259 收藏 -
用 Go 的 multipart.Reader 逐段接收大文件,把请求体写入临时文件并在边界解析或磁盘失败时可靠清理,配套可运行的上传接口、大小限制与验收方法。340 收藏