Go语言技术文章
-
Go mod 中的 replace 相对路径依赖主模块目录和完整工作区,CI 中常因替换目录未检出、嵌套模块选错或目标缺少 go.mod 而失效。本文给出定位命令、仓库布局修复方式与切换模块版本的判断标准。301 收藏 -
Go httptrace.DNSDone 回调里的 Err、Addrs 和 Coalesced 分别表示什么?本文从请求上下文接入 ClientTrace,说明如何读取 DNS 阶段错误、区分最终请求错误,并处理回调并发与空地址列表。451 收藏 -
Go io.ReaderAt 的短读不能简单当成失败或成功。本文说明如何保留 n 个有效字节,区分正常尾部 EOF、固定块中途 ErrUnexpectedEOF 与底层 I/O 错误,并封装安全的定长读取函数。143 收藏 -
Go 进程内存持续增长而 heap profile 没有明显对象时,不要直接认定是 heap 泄漏。本文区分 RSS、HeapAlloc、堆保留空间、goroutine 栈和分配 churn,并用 heap、allocs、runtime.MemStats 与 runtime/metrics 组合定位增长层。253 收藏 -
Go GC 延迟抖动需要把分配速率、辅助标记 CPU、暂停与调度等待放在同一窗口比较。本文给出支持列表采集示例,说明累计直方图差分、缺失指标和升级对照的判断边界。370 收藏 -
Go pprof 端口不只是一个性能页面:/debug/pprof/ 可能返回命令行、栈信息和运行时 profile,CPU 与 trace 采集还会带来额外开销。本文说明暴露风险,并给出只监听本机、受控访问和发布前检查的方法。214 收藏 -
Go pprof 中 alloc_objects 很高,通常说明运行期间累计创建了很多对象,不等于当前堆占用高或存在内存泄漏。本文用 alloc_space、inuse_objects 和调用栈给出判断与定位方法。485 收藏 -
Go net.Dialer.Control 提供了真正拨号前接触底层连接的入口。本文用 syscall.RawConn.Control 说明如何在回调内读取或设置 socket 参数、传递错误,并处理网络名变化与文件描述符生命周期边界。328 收藏 -
Go 子测试名称里的斜杠会参与分段匹配。本文用原创路由测试说明 -run 的逐段正则、空中间段、锚点与父测试执行规则,并给出名称回滚和叶子用例确认方法。249 收藏 -
Go testing.T.Chdir 会修改整个测试进程的当前工作目录,因此不能和 t.Parallel 或拥有并行祖先的测试混用。本文解释冲突原因,并给出串行使用和显式传递目录两种安全组织方式。359 收藏 -
Go race detector 的创建栈用于追踪任务启动来源,访问栈用于定位冲突读写。通过任务编号、共享对象与互斥锁示例,说明如何确定同步责任并理解报告范围。206 收藏 -
atomic 只保证参与原子操作的那次访问,不会自动把同一变量旁边的普通读写变成安全访问。本文解释混用产生数据竞争的原因,并给出统一 atomic 或改用 Mutex 的写法。465 收藏 -
Go sync.Cond.Wait 必须在持有 Cond.L 时调用。本文说明 Wait 原子释放与重新加锁的边界、为什么要用 for 重新检查条件,以及状态修改、通知和 channel 选择的实用判断。164 收藏 -
reflect.Value.SetString 只有在目标值有效、Kind 为 String 且 CanSet 为 true 时才适合调用。本文说明指针取 Elem、结构体字段和未导出字段的边界。400 收藏 -
Go encoding/binary.Uvarint 返回 n=0 通常表示当前字节切片还不完整,不是已经确认格式错误。本文解释 n 的正负含义、补读缓冲区的方法,以及 Uvarint 与 ReadUvarint 的选择边界。171 收藏