Go问答技术文章
-
Go append 后原切片看起来也变了,根因通常是多个切片共享底层数组且容量仍有余量。本文用 len、cap、三下标切片和 copy 说明复用边界,并给出追加隔离与完全复制的选择方法。130 收藏 -
Go 切片只是底层数组的一段描述符,直接返回大缓冲区中的小片段时,指针仍可能让整个数组保持存活。本文用切片长度、容量和复制副本说明保留原因,并给出 make+copy、append 复制和指针元素清理的实用边界。213 收藏 -
Go 接口不等于 nil 时,问题通常不是 nil 比较失效,而是接口仍携带动态类型。本文用 typed nil、error 返回和类型断言示例,说明如何定位调用失败并修正返回边界。358 收藏 -
Go 的 range 读 Channel 不会因为暂时没有消息而结束,只有发送方关闭通道才会收到结束信号。本文从阻塞复现、单发送者关闭、多发送者协调和提前退出取消四个场景,整理一套不 panic、不泄漏的收尾方式。101 收藏 -
把 os.File 遍历迁移到 io/fs.FS 时,WalkDir 返回的是文件系统内部的逻辑路径。本文说明如何在交给外部工具前安全转换为操作系统路径,并列出跨平台回归检查点。386 收藏 -
短超时压测后 Goroutine 数量不回落,不一定都是 Context 失效。本文用 worker pool 拆开工作取消与结果发送两个等待点,给出可执行的 Go 修复写法和 pprof 定位方法。265 收藏 -
Go 错误一旦经过 fmt.Errorf 包装或 errors.Join 合并,直接比较和类型断言就容易失效。本文用 errors.Is、errors.As 和 Join 建立稳定的分类与诊断路径。184 收藏 -
多个 Goroutine 并发执行时,errgroup 可以把首个错误、兄弟任务取消和统一等待放进同一条收敛链。本文给出可直接改造的 Go 写法,并说明 Context 必须传到真正执行 I/O 的位置。397 收藏 -
Go 调用方超时并不代表下游工作已经停止。本文用一条清晰的调用链说明如何把 Context 传到真正执行 I/O 的函数,在阻塞点响应取消,并用 cancel 和 Cause 正确收尾。323 收藏 -
WalkDir 返回的是跨平台的 fs 逻辑路径,不是通用的磁盘绝对路径。本文用根目录封装、filepath.FromSlash 和边界判断,说明如何把结果安全交给外部工具。292 收藏 -
多发送者写入同一个 Go Channel 时,关闭责任应由等待所有发送者结束的协调者承担;本文用 WaitGroup 和 Context 说明如何避免重复关闭、发送到已关闭 channel 以及 Goroutine 泄漏。379 收藏 -
WaitGroup 本身没有超时参数。本文用完成通知实现可超时等待,再区分 Context 取消与直接放弃等待,避免把调用方超时误判成任务已停止。398 收藏 -
Go 服务变慢不一定先看 CPU。本文用 block profile 与 mutex profile 的记录语义、采样开关和 pprof 视图,说明如何区分等待方与持锁方,最后把画像结果落到具体同步点。130 收藏 -
遇到 concurrent map writes 不要只给 map 加锁了事。本文从最小复现开始,用 -race 报告定位共享访问,再按互斥、单所有者和 sync.Map 的边界完成修复。496 收藏 -
encoding/json/v2 的 SemanticError 既可能来自请求值不匹配,也可能来自 Go 类型结构问题。本文用字段提取、契约测试和 HTTP 分层策略,说明如何定位 JSON 指针与底层原因。159 收藏