-
Go fuzz 测试发现崩溃后,关键不是盯着随机输入猜原因,而是读取失败样本路径,使用 go test -run 精确重放,并把最小化样本保留为回归测试。本文给出可直接套用的排查顺序与边界。
-
sync.Pool 的 Get 方法本身没有 error 返回值。遇到‘返回错误’时,应先区分 nil、类型断言失败和复用对象残留状态,再回到 Put 前的重置与调用方逻辑排查。
-
Go bufio.Writer 会先缓存写入数据,尾部缺失时应按 Write 返回值、Buffered、Flush 错误和底层持久化语义逐层排查。本文给出文件输出、defer 收尾和可注入错误 Writer 的原创示例。
-
Go pprof 中 alloc_objects 很高,通常说明运行期间累计创建了很多对象,不等于当前堆占用高或存在内存泄漏。本文用 alloc_space、inuse_objects 和调用栈给出判断与定位方法。
-
Go sync.Pool 不是固定容量的对象缓存,Get 可能忽略池、池中对象也可能被自动清理。本文从 New、Get、Put 和 GC 的真实生命周期出发,排查配置看似没有生效的原因,并给出可观测、可安全归还的复用写法。
-
Go json.Compact 会删除 JSON 结构中的无意义空白,但保留字符串内容,并把结果追加到 bytes.Buffer。本文说明最小调用、错误处理、已有前缀和它与 gzip、Indent、Marshal 的边界。
-
Go 模块发布后发现严重问题时,可以用 retract 标记单个版本或闭区间,让后续版本选择避开它,同时保留已有项目的可复现构建。本文说明 go.mod 写法、承载版本、go list 查询与旧工具链边界。
-
用 Go iter.Pull 构建受限整数收集器,区分 nil 迭代器、空序列、合法零值、解析错误与提前停止,提供完整代码,并解释 defer stop、panic 传播和资源清理的边界。
-
Go netip.AddrFromSlice 可以把 4 字节或 16 字节切片解析为 netip.Addr。本文说明 IPv4、IPv6、长度错误、IPv4 映射 IPv6 与 AddrFrom4、AddrFrom16、ParseAddr 的选择边界。
-
Go 的 ETag 条件请求总是返回 200,通常不是客户端没有缓存,而是服务端没有读取 If-None-Match、比较规则不兼容,或在写入响应体后才尝试返回 304。本文给出可直接改造的 net/http handler 和排障顺序。
-
Go maphash.Bytes 可以直接把 []byte 映射为 uint64 哈希值。本文说明 MakeSeed 与 Seed 复用、Bytes 和 Hash.Write 的关系,以及进程边界和密码学用途限制。
-
Go pprof 暴露后,优先把业务 mux 与诊断 mux 分开,并让 pprof 监听回环或私网地址;需要远程采集时再叠加 TLS、认证、代理和 profile 级采集边界。
-
Go benchmark 调用 testing.B.ReportAllocs 后,可以在结果中看到 allocs/op 与 B/op。本文说明如何放置调用、排除准备阶段、比较子 benchmark,并处理 b.Loop、b.N 和 RunParallel 的统计边界。
-
unique.Make 不负责打开文件。本文用 os.DirFS、fs.ValidPath 和 fs.ReadFile 在固定根目录下读取文件,再把文件内容交给 unique.Make 做规范化,并说明符号链接、可比较类型和 Go 版本边界。
-
Go runtime/metrics 的 Sample.Value 不能直接按一种数值类型读取,应先用 Kind 判断 KindBad、KindUint64、KindFloat64 或 KindFloat64Histogram,再调用对应方法。本文说明类型分派、未知指标处理和复用采样切片时的边界。