Go语言技术文章
-
go.mod 的 replace 指向 ../local-module 时,开发机能编译并不代表发布环境也能找到该目录。本文从模块图和构建上下文解释失败原因,并给出 go.work、本地模块版本和发布前检查清单。499 收藏 -
Go runtime.GC 只能推动一次垃圾回收,不能保证进程 RSS 立刻下降。本文区分对象可达性、运行时堆页和操作系统内存,给出 MemStats、pprof、FreeOSMemory 与 GOMEMLIMIT 的使用边界。187 收藏 -
Go module 的 pseudo-version 中间 14 位是修订创建时间的 UTC 表示,不是 author time。本文拆解基准版本、时间戳和提交哈希,并用 go list -m -json 核对实际依赖。240 收藏 -
Go 服务里记录 panic,关键是把 recover 放进 defer 函数,并用 runtime/debug.Stack 保存当前 goroutine 的调用堆栈,再补上请求标识和恢复边界。183 收藏 -
Go fuzz 失败后会把可复现输入写入 testdata/fuzz 目录。本文说明如何区分 seed corpus 与缓存语料,用 go test 精确重放、理解最小化输入,并把失败文件保留为回归测试。116 收藏 -
Go 的 errors.As 会沿着错误包装链查找匹配类型。本文用自定义错误说明 %w、目标变量和指针层级的正确写法,并给出迁移与回归检查清单。487 收藏 -
Go benchmark 的 allocs/op 偏高时,不要先猜编译器或垃圾回收;从测试夹具、循环内临时值、切片扩容、字符串转换和逃逸边界逐项拆分,才能定位真正的分配来源。322 收藏 -
errors.Join 会丢弃 nil 参数;只有所有输入都是 nil 时才返回 nil。本文用批量校验示例说明如何判断聚合结果,并用 errors.Is 识别具体错误。364 收藏 -
Go 表驱动测试加上 t.Parallel 后,多个子测试可能读到同一个循环变量。本文解释暂停时机、Go 版本差异、局部绑定写法和 -race 排查边界。444 收藏 -
用 Go 的 sync/atomic.Value 保存同一具体类型的只读配置快照,写入方复制后整体替换,读者通过 Load 无锁读取,并避开共享 map、类型漂移和并发写入等常见坑。435 收藏 -
Go test -run 匹配不到子测试名称,通常是忽略了父子测试名称的斜杠分段。本文用原创示例解释逐层正则、空段、锚点和特殊字符的写法,并给出 -list 排查清单。386 收藏 -
Go net.SplitHostPort 遇到无端口、未加括号 IPv6 和空端口时分别怎样处理?本文用地址边界、错误类型、JoinHostPort 和输入预检说明正确写法。491 收藏 -
go test -race 报告读写冲突时,不要只看两行文件位置;要沿访问栈、创建栈和共享存储边界确认真正被并发访问的变量,再选择锁、channel 或 atomic 修复。352 收藏 -
net.ParseIP 返回的 IPv4 地址也是 16 字节,String() 只是显示形式。本文解释 IPv4-mapped IPv6 的统一表示,并给出用 IP.To4() 判断 IPv4 的可靠写法。214 收藏 -
go vet 报 copylocks 通常说明包含 Mutex 等同步对象的结构体被按值传递或复制。本文解释值接收者、参数、赋值和 range 的风险,并给出指针接收者与无锁快照的修复方式。246 收藏