Go语言技术文章
-
用 Go testing.F 为字符串解析器添加少量边界种子,区分预期的解析错误与真正的不变量破坏,并让 fuzz 失败输入沉淀到 testdata/fuzz/FuzzParseRecord,成为可重复执行的回归样本。313 收藏 -
Go select 中的 default 不会等待通信,放进无界消费者循环就会造成 busy loop。本文说明如何改成阻塞式消费,或用 ticker 控制必要的周期检查,并通过 CPU、日志和退出行为验证修复。237 收藏 -
Go testing.T Setenv 会在测试结束后恢复环境变量,但修改过程影响整个进程,因此不能与 t.Parallel 或并行祖先组合使用。本文拆解冲突原因,并给出串行边界、显式配置和子进程隔离三种处理方式。475 收藏 -
Go select 同时命中多个 case 时不会按源码顺序固定执行,而是在可通信的 case 中做均匀伪随机选择。本文用最小示例解释规则,并给出优先级、取消和测试的确定性处理方式。349 收藏 -
通过 Go testing.T.Cleanup 的资源夹具示例,说明同一个测试对象为何按后注册先执行,并梳理父子测试、失败路径与并行测试的清理边界。232 收藏 -
讲清 Go errors.Join 在资源清理中的用法:如何合并主错误与 Close 错误、批量保留多个清理错误,并用 errors.Is 与 errors.As 做判断。108 收藏 -
讲清 Go errors.As 如何穿过 %w 包装错误提取自定义类型,说明指针目标的正确写法、false 与 panic 的边界,以及错误链在业务工作流中的接入方式。263 收藏 -
多个 Go 生产者不要争抢 close 权限:用独立停止信号让生产者退出,用 sync.WaitGroup 确认全部结束,再由唯一协调者安全关闭输出通道。497 收藏 -
Go ticker 本身不会无限累积任务,长时间运行后出现漂移通常与任务耗时、接收延迟或完成后重新等待有关。本文用固定截止时间解释跳过与补偿的选择。247 收藏 -
Go context.AfterFunc 适合在上下文取消时触发连接、临时文件等资源的兜底回收,但 stop 只解除回调关联,不等待回调结束。本文用 stop、完成信号和 sync.Once 拆解正常完成与取消竞态。202 收藏 -
Go 程序在精简容器中调用 time.LoadLocation 报 unknown time zone,通常是镜像没有 IANA 时区数据。本文按查找顺序解释根因,并比较安装 tzdata、嵌入 time/tzdata 与显式加载数据的取舍。375 收藏 -
context.AfterFunc 的 stop 函数只负责阻止尚未启动的回调,不保证等待。本文用 sync.Once 和 done 通道封装主动 Close 与 Context 取消,避免资源清理重复执行。292 收藏 -
Go 的 time.Time 用 == 比较失败,通常不是时间点不同,而是 Location 或单调时钟读数不同。本文解释 Equal、Round(0) 与 UTC 的使用边界。298 收藏 -
讲清 Go http.Request.Clone 复制请求并替换目标 URL 的正确写法,覆盖 Host、RequestURI、查询参数和 Body 重发边界。412 收藏 -
Go DNS 查询在容器里超时时,不要先把问题归因于业务服务。本文用容器内 resolv.conf、net.Resolver、Resolver.Dial、DNSError 和直连 IP,把配置、DNS 网络、解析响应与业务连接分层排查。248 收藏