Go语言技术文章
-
Go pprof CPU profile 看不到业务函数时,先区分采样窗口没有业务热点,还是 profile 与分析端二进制没有正确配对。本文给出精确二进制、本地符号化、构建裁剪和复采样的排查路径。248 收藏 -
Go httptrace.WroteRequest 回调中的 Err 只描述请求写入阶段,不能单独证明服务端是否收到或处理了请求。本文用阶段化 trace、主流程错误和幂等重试边界,说明如何判断请求状态。393 收藏 -
Go 调整 GOGC 后暂停时间没有明显变化,通常不是参数没用,而是 GOGC 只改变目标堆大小和 GC 频率,单次暂停还可能受根扫描、调度停顿、GC assist 与分配突增影响。本文按证据拆分根因并给出修复边界。280 收藏 -
解释 Go time.AfterFunc 的回调与 Timer.Stop 同时发生时如何判断返回值,并用 done 或 WaitGroup 协调回调完成与资源清理。148 收藏 -
Go Timer Reset 后仍读到旧事件,先看 Go 版本与 Timer 类型:Go 1.23 的 NewTimer 已保证 Reset 后不返回旧值,旧版本需要 Stop 加非阻塞排空;AfterFunc 还要单独处理并发回调。117 收藏 -
Go Ticker 相关的 goroutine 增长需要区分接收循环滞留和业务回调堆积。本文解释 Stop 不关闭 C、Go 1.23 回收边界,并给出可取消同步循环,明确取消、停表与等待收尾的职责。378 收藏 -
Go 无缓冲通道发送和接收必须同时就绪。若同一个 goroutine 先发送再接收,或接收方提前退出,发送与接收就可能一起等待。本文按现场信号区分正常同步、双端阻塞、nil 通道和关闭通道,并给出可退出的修复方式。262 收藏 -
Go select 中的 default 会让没有就绪通信时立即返回。把它放进无限循环会形成忙等,持续消耗 CPU。本文用一个小型通道消费者区分阻塞等待、周期处理、取消退出和一次性非阻塞探测的正确写法。365 收藏 -
Go 向已关闭通道发送会 panic,增大缓冲、状态探测和 sync.Once 都不能保证安全。本文给出多发送者由协调者等待后关闭的完整示例,并区分取消通知、数据结束与完成信号。452 收藏 -
sync.Map.LoadAndDelete 同时完成读取和删除,真正判断键是否存在要看 loaded,而不能只看 value 是否为 nil。本文用一个可运行的小场景拆开返回值、并发语义和常见误判。133 收藏 -
本文说明如何用带缓冲 channel 作为槽位池限制 Go 并发任务数,覆盖容量语义、槽位获取与释放、context 取消、WaitGroup 收尾,以及信号量和固定 worker 的选择边界。374 收藏 -
Go Background 本身不保存请求值。本文区分派生上下文复用、共享可变对象和取消关系,提供每请求独立关联号中间件,并说明私有键、WithoutCancel 与后台任务的数据边界。442 收藏 -
Go 使用 context.WithCancel 后 goroutine 仍不退出,通常是 worker 没有监听 ctx.Done 或底层调用不可取消。本文按取消传播、worker 改写和依赖调用三个层次说明排查与修复边界。306 收藏 -
Go 的 os.Rename 跨文件系统失败通常对应 Unix-like 系统的 EXDEV。本文从 LinkError 和挂载边界入手,说明何时继续使用 Rename,以及如何用复制、落盘、目标切换和源文件清理实现可恢复的跨文件系统移动。301 收藏 -
Go TempFile 创建成功不代表清理必然成功。本文说明句柄关闭、路径删除和资源归属的区别,给出保留业务与清理错误的函数,并讨论 Windows 占用、延迟清理及用户状态反馈。301 收藏