Go问答技术文章
-
Go 项目已有 vendor 目录却没有使用时,先检查主模块根目录、go.mod 的 go 版本、GOFLAGS 或 -mod 覆盖项,再用 go mod vendor 同步 vendor/modules.txt,并用 -mod=vendor 确认构建路径。413 收藏 -
Go pprof 阻塞 profile 没有数据时,重点检查 SetBlockProfileRate、pprof 路由、采集窗口和真实阻塞事件。本文给出最小配置、读取命令和排查边界。209 收藏 -
Go 的 replace 会改变依赖内容和模块图,但不会单独完成版本选择。本文用 go list -m all、go env GOWORK 和最小 go.mod 示例,定位版本不一致并区分本地开发与正式构建配置。430 收藏 -
Go pprof 堆 profile 与实时对象数量不同,常见原因是指标单位、存量与累计口径、GC 时点和采样估算不同。本文用两份本地快照示例说明如何保留对象、显式选择指标,并避免误判泄漏。211 收藏 -
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 收藏