Go语言技术文章
-
Go 里把已经编码的参数再次交给 QueryEscape,常会出现 %25、%2B 等二次编码结果。本文用一个小型 URL 构造器区分查询参数、路径段和 URL 字段,给出稳定的排查与修复写法。360 收藏 -
Go regexp 的匹配实现采用 RE2 语义并保证随输入长度线性运行。遇到复杂模式耗时异常时,应先区分输入规模、重复编译和匹配次数,再用预编译与输入上限控制实际成本。218 收藏 -
解释 Go string 的字节长度、rune 字符边界和显示宽度差异,给出安全截断中文文本的实现与上线检查方法。403 收藏 -
并发测试里固定随机种子仍可能复现不了同一结果,常见原因是多个 goroutine 共享 Rand 或 Source,调用顺序被调度改变。本文按当前 math/rand 规则解释并发边界,给出局部随机源、种子派生和 rand.Seed 迁移方案。442 收藏 -
slog 包装 Handler 丢失 With 字段,常见原因是未保留派生状态。本文给出四方法委托实现与父子、分组、等级测试,并区分 Record 属性和 context.Value 的处理边界。213 收藏 -
Go runtime trace 里出现 goroutine 阻塞并不一定是锁竞争,也可能来自网络、系统调用或调度延迟。本文按事件与等待原因拆解分析路径,并说明何时切换到 pprof。236 收藏 -
Go pprof heap 报告定位不了内存泄漏,通常不是命令少,而是采集窗口、inuse 与 alloc 指标、采样率没有分开处理。本文给出一套可重复的采集和阅读顺序。338 收藏 -
gctrace 的 clock、cpu 与堆目标各有统计口径。本文区分 STW 和并发标记、goal 与 RSS,说明先构建后采集的写法,以及日志开销、采样周期和结构化指标的边界。408 收藏 -
Go 服务请求结束后内存不降,不一定是 GC 失效。本文只围绕切片容量、缓存引用和 runtime/metrics 指标,说明如何区分活跃堆、保留的 backing array 与尚未归还的运行时页。299 收藏 -
Go test -cover 的高百分比不等于边界已覆盖。本文用一个输入校验例子,说明如何拆分分支矩阵、补齐错误路径,并用 coverprofile 找到真正漏测的位置。122 收藏 -
Go Benchmark 结果抖动时,先检查 ResetTimer、RunParallel 与外部资源是否把计时范围混在一起。本文用固定输入、并行边界和重复运行命令整理 ns/op 与 allocs/op 的正确解释方式。395 收藏 -
Go fuzz 测试持续扩大输入时,问题往往来自探索时间、失败输入最小化和共享状态副作用叠加。本文按故障复盘顺序拆分 -fuzztime、-fuzzminimizetime、seed corpus 与 target 隔离,给出可控且可复现的排查方案。257 收藏 -
httptest 的 Host 与普通 Header、URL.Host 并非同一字段。本文解释路径请求的默认主机,给出表驱动 Handler 测试和本地 HTTP 往返写法,并说明端口与 TLS 的边界。200 收藏 -
Go 测试单独运行正常、并行运行却偶发失败,通常不是断言随机,而是环境变量、临时文件、全局配置或可变夹具被多个测试共享。本文按故障根因拆解 t.Parallel 的并发边界,并给出参数化配置、t.TempDir、串行环境变量和分组清理的隔离方案。499 收藏 -
Go ldflags 注入变量为空时,优先检查包路径、包级 string 变量和最终构建命令。本文用 go list 获取真实 import path,说明 -X 的变量边界、shell 引号和 CI 二次构建覆盖问题。162 收藏