-
Go fuzz 测试读取相对路径文件失败,通常不是 fuzz 引擎改变了规则,而是相对路径基准与预期不一致。本文说明 go test 的包目录语义、testdata 夹具布局、fuzz 回调的并发边界,以及 go:embed 和显式绝对路径的取舍。
-
TestMain 控制包级测试入口,错误的 os.Exit 可能覆盖子测试失败状态。本文说明正常返回的退出语义、保留 m.Run 结果的方法,以及辅助函数清理、CI 状态传播和并行子测试的边界。
-
Go 的 GOFLAGS 会把已知命令行参数注入到默认行为中,且可能来自当前 shell 或 go env -w 的持久配置。本文用 go test、go list 和 go env 说明它的来源、覆盖顺序与清理方法。
-
Go 构建在启用 vendor 模式时会从主模块根目录的 vendor 目录取包,不会读取模块缓存中的同名新版本。本文拆开 go.mod、vendor/modules.txt 与 -mod=vendor 的职责,说明如何更新 vendor、如何暂时切回模块缓存,以及怎样判断版本来源。
-
cgo 不会让 Go 构建缓存整体失效。本文区分包编译、外部 C 构建和链接,说明 CI 缓存持久化、工具链固定,以及系统 C 库更新后必须显式失效的边界。
-
解释工作区模式下 go.work replace 覆盖成员模块 go.mod replace 的原因,演示如何确认 GOWORK、匹配规则和最终模块来源,并给出可回滚的修复方法。
-
Go panic 不是另一种 error 返回值,而是会沿当前 goroutine 调用栈展开的控制流。本文说明 panic、defer、recover 与 error 的职责边界,以及如何只在明确边界处恢复并转换为错误。
-
Go gzip.Reader 默认会把拼接的多个 gzip 成员连续解压。本文说明 Multistream(true) 的默认语义,以及怎样用 Multistream(false)、io.ByteReader 和 Reset 按成员读取。
-
Go errors.Is 默认按错误值和包装链判断匹配;当业务错误需要对外表现为某个哨兵错误时,可以实现 Is(error) bool 做稳定的浅层匹配。本文说明实现方式、包装链行为和常见边界。
-
json.Unmarshal 负责解码,不自动执行必填校验。通过创建任务示例,说明指针字段如何保留合法 false、RawMessage 如何区分缺失与 null,以及业务对象转换和严格解码的边界。
-
Go json.Encoder 默认会把 JSON 字符串中的 HTML 相关字符转成 Unicode 转义,SetEscapeHTML(false) 可在非 HTML 场景恢复可读输出。本文对比两种文本表示,解释安全边界、Encoder 与 Marshal 的区别以及 Encode 末尾换行。
-
Go json.Decoder.UseNumber 只改变解码到 interface{} 时的数值类型,不是 Marshal 的全局开关。本文拆开 float64、json.Number、string 与 RawMessage 的边界,说明何时能保留数字字面量、何时已经无法恢复原始表示。
-
QueryContext 取消后连接仍显示存在,通常是连接被归还连接池而不是立即断开;只有 Rows 未关闭、驱动不响应取消或专用连接未 Close 时,才需要继续排查资源占用。
-
sql.NullString 用于接收数据库 NULL,但它没有把自身自动编码为 JSON null。本文从 String、Valid 两个字段解释输出为何是对象,并给出接口层输出 null 的两种稳妥写法。
-
Go database/sql 的 Tx.Commit 会把提交动作交给底层驱动,连接中断、事务上下文取消或事务已结束都可能让调用方得到错误。本文按错误边界说明如何判断提交结果,以及为什么不能对未知状态盲目重试。