Go语言技术文章
-
Go 错误一旦经过 fmt.Errorf 包装或 errors.Join 合并,直接比较和类型断言就容易失效。本文用 errors.Is、errors.As 和 Join 建立稳定的分类与诊断路径。184 收藏 -
CI 获取 Go 私有模块失败时,不要只把 GOPROXY 改成 direct。先看模块前缀是否命中 GOPRIVATE,再区分 GONOPROXY、GONOSUMDB、私有代理回退规则和非交互凭据问题。339 收藏 -
多个 Goroutine 并发执行时,errgroup 可以把首个错误、兄弟任务取消和统一等待放进同一条收敛链。本文给出可直接改造的 Go 写法,并说明 Context 必须传到真正执行 I/O 的位置。397 收藏 -
通过源码调用图与二进制符号表两个证据边界,讲清 govulncheck source、binary 模式的运行方式、结果差异、局限和修复决策。142 收藏 -
依赖升级后版本仍不如预期,通常不是 go get 失效,而是 MVS 按完整模块图计算了 build list。本文用三组 Go 命令定位谁抬高了版本,并处理 replace、exclude 与工作区边界。462 收藏 -
Go 调用方超时并不代表下游工作已经停止。本文用一条清晰的调用链说明如何把 Context 传到真正执行 I/O 的函数,在阻塞点响应取消,并用 cancel 和 Cause 正确收尾。323 收藏 -
WalkDir 返回的是跨平台的 fs 逻辑路径,不是通用的磁盘绝对路径。本文用根目录封装、filepath.FromSlash 和边界判断,说明如何把结果安全交给外部工具。292 收藏 -
govulncheck 的结果不只是在说依赖版本旧,还在说明漏洞符号是否能从项目入口被调用。本文按导入、符号和测试范围拆分扫描,帮助你判断哪些结果需要立即升级。189 收藏 -
多发送者写入同一个 Go Channel 时,关闭责任应由等待所有发送者结束的协调者承担;本文用 WaitGroup 和 Context 说明如何避免重复关闭、发送到已关闭 channel 以及 Goroutine 泄漏。379 收藏 -
WaitGroup 本身没有超时参数。本文用完成通知实现可超时等待,再区分 Context 取消与直接放弃等待,避免把调用方超时误判成任务已停止。398 收藏 -
Go 服务变慢不一定先看 CPU。本文用 block profile 与 mutex profile 的记录语义、采样开关和 pprof 视图,说明如何区分等待方与持锁方,最后把画像结果落到具体同步点。130 收藏 -
Go modules 中 replace 写了却仍下载远程模块时,按主模块、require、替换版本和 go list -m -json 结果逐层定位真实来源。409 收藏 -
govulncheck 报告中的 symbol 不是普通关键词,而是漏洞函数或方法在项目调用图中的落点。本文从源码扫描开始,演示如何区分导入命中、真实可达调用和分析边界,并用 traces 与 JSON 固化排障证据。151 收藏 -
遇到 concurrent map writes 不要只给 map 加锁了事。本文从最小复现开始,用 -race 报告定位共享访问,再按互斥、单所有者和 sync.Map 的边界完成修复。496 收藏 -
Go 服务 CPU 飙高、内存上涨或请求变慢时,按症状选择 CPU、heap、goroutine、block、mutex profile,再用 top、list 和对照采样确认热点。314 收藏