Go语言技术文章
-
使用 Go 的 exec.Cmd.StdinPipe 向子进程提供标准输入时,关键不是只拿到一个 io.WriteCloser,而是明确 Start、Write、Close、Wait 的生命周期。本文用一个可迁移的写法说明如何让 EOF 正确到达,并区分输入写入错误、启动错误和命令退出错误。157 收藏 -
Go reflect.Value.SetIterKey 用于把 MapRange 当前条目的键写入可设置的 Value。本文说明 MapIter.Next、键类型可赋值、CanSet 与迭代器状态边界,并对比 Set(iter.Key()) 的使用方式。389 收藏 -
讲清 Go crypto/mldsa.PublicKey.Bytes 如何导出可分发的 ML-DSA 公钥编码,怎样携带参数集并用 NewPublicKey 恢复对象,以及如何提前判断长度和参数错配。152 收藏 -
Go encoding/json/v2 默认把 nil map 编码为空 JSON 对象。本文说明怎样用 FormatNilMapAsNull 恢复 null 语义,并给出字段级覆盖与迁移回归清单。369 收藏 -
Go 的 os.File.Chdir 可以把已经打开的目录句柄设为当前工作目录,适合需要复用目录句柄的场景。本文从一次相对路径读取失败的排查开始,说明打开、切换、恢复、关闭和并发边界。482 收藏 -
strconv.Unquote 解析配置值失败,通常不是反斜杠本身不能出现,而是输入没有遵守 Go 字符串字面量的引号和转义规则。本文用路径配置拆开缺少引号、未知转义和重复转义三种情况,并给出统一处理与 Quote 配对的写法。203 收藏 -
以Linux交叉构建为范围,区分目标架构与链接方式,介绍关闭cgo和保留目标C工具链两条路线,并说明动态加载器、共享库及运行镜像迁移条件。397 收藏 -
Go 表驱动测试调用 t.Parallel 后,子测试可能在外层循环继续修改变量时才真正执行。本文从调度语义、Go 1.22 循环变量规则和指针切片共享边界说明原因,并给出兼容旧模块的修复写法。459 收藏 -
Go race 没有报告某次数据竞争,并不等于代码绝对安全。本文从运行路径、并发时序、race 构建和 !race 文件四个方面拆解漏报原因,并给出一份可复查的测试覆盖清单。488 收藏 -
区分f.Add种子、testdata文件语料与fuzz探索缓存,说明目标目录、包路径、单样本过滤及输入类型匹配,并用边界错误示例解释如何建立稳定回归。487 收藏 -
解释 Go slog JSONHandler 的 JSON 字段顺序为何不能当作契约,并给出按键解析、稳定测试和固定文本格式化方案。124 收藏 -
Go pprof 看不到短生命周期函数,通常不是函数被忽略,而是 CPU profile 按固定采样点记录调用栈,短调用可能没有撞上采样点,或累计 CPU 占比太低。本文用对照示例说明如何延长采样窗口、读取聚合结果并排除误判。447 收藏 -
Go 的 log.Fatal 会先输出日志,再调用 os.Exit(1)。os.Exit 立即结束进程,不执行当前调用链中的 defer,因此清理逻辑会被跳过。本文拆开调用关系,并给出把错误返回到 main、让资源先完成 defer 的写法。263 收藏 -
Go errors.As 返回 false 时,先看错误实现的 Error 接收者和实际动态类型,再决定目标变量是 *T 还是 T。本文用一个小型校验错误示例说明指针错误、值错误、%w 包装和常见声明误区。483 收藏 -
crypto/rand.Text 返回的不是任意字母数字串,而是基于 RFC 4648 Base32 的密码学安全文本。本文从官方实现拆开字符集合、长度与自定义字符表的边界。329 收藏