-
Go embed pattern 无匹配文件时,先按源码包目录定位资源,再恢复编译前的真实产物。结合包内目录示例说明空目录、隐藏文件、上级路径与构建流水线的修复取舍。
-
Go build tags 未选中目标文件时,先用 go list 看文件分类,再检查 //go:build 位置和布尔表达式,最后核对 GOOS、GOARCH、cgo 与 -tags。本文给出一套从现象到修复的排查顺序。
-
Go 交叉编译时把 CGO_ENABLED 改成 1 还不够。本文按目标三元组、CC/CXX、头文件与 sysroot、pkg-config 和链接阶段给出一套工具链排查顺序。
-
Go compress/flate 的 Write 只接收输入,Writer.Close 才负责把待处理数据和压缩流结尾写入底层 Writer。本文区分 Flush、Close、Reset 的职责,说明底层写入错误如何传回,以及流式压缩在文件、内存和网络场景中的收尾方式。
-
Go text/template 的 Execute 执行失败时,Writer 可能已经收到部分结果。本文用 missingkey=error 解释部分输出与错误同时存在的原因,再用 bytes.Buffer 隔离模板渲染和正式提交,并区分模板错误、最终写出错误、并发共享 Writer 与 html/template 的边界。
-
Go benchmark 第一次结果偏慢时,先区分测试框架的首轮校准、被测函数的 lazy init 和环境噪声,再决定是否预热。本文用 b.Loop、StopTimer、ResetTimer 以及 -benchtime、-count 组合,建立可解释的 cold path 与 warm path 测量方式。
-
Go fuzz 语料没有复现时,先核对 FuzzXxx 入口、目标包目录以及 testdata/fuzz/FuzzXxx 的大小写匹配,再用 go test 和精确的 -run 子测试名定位问题。
-
Go race 无报告不能证明全程序并发正确。本文从包范围、实际路径和共享对象排查覆盖盲区,给出并发用例结构与测试参数,并区分数据竞争检测和业务断言。
-
Go pprof 里找不到一个很短的函数,不一定代表它没有执行。CPU profile 记录的是离散采样时刻的活跃调用栈,短函数可能因命中次数少而没有独立排名。本文从 flat、cum、采样窗口、源码定位和 profile 类型五个角度给出排查流程。
-
Go unicode.IsMark 判断的是单个 rune 是否属于 Unicode 的 Mark 类别 M,包含非间距、间距组合和包围标记。本文用具体字符串拆开预组字符与组合序列,说明如何按 rune 分类、如何解释字节偏移,以及为什么 IsMark 不能代替正规化或用户感知字符切分。
-
Go 的 log.Fatal 写出日志后会调用 os.Exit(1),不会等待当前函数或其他 goroutine 的 defer 展开。本文从函数返回、panic 与进程级退出的边界出发,说明资源清理、错误返回和 main 集中退出的组合方式。
-
Go fmt.Errorf 多个 %w 可保留多个错误原因。结合处理与清理失败场景说明 nil 组合、错误树、errors.Unwrap 的限制,以及分类与兼容性取舍。
-
Go os.File.ReadFrom 没有 offset 参数,需要先用 Seek 设置目标文件当前偏移,再从 io.Reader 流式写入;本文说明 n、err、覆盖范围和 O_APPEND 的边界。
-
Go 程序在本地、容器和精简系统中出现时区差异时,不要直接依赖 time.Local。本文用 time.LoadLocation、ZONEINFO、time/tzdata 和启动自检建立一套可排查的部署处理方案。
-
errors.Is 匹配不到自定义包装错误,通常不是错误消息不一致,而是包装类型没有通过 Unwrap 暴露内部原因,或创建包装时使用了 %v。本文用错误树、单错误 Unwrap、多错误 Unwrap 和自定义 Is 方法梳理排查与设计边界。