为什么这两个文件总是一起出现

很多刚接触 Go 模块的人都会问:既然已经有 go.mod 了,为什么还要有一个 go.sum

简单说:

  • go.mod 负责描述你需要哪些模块
  • go.sum 负责记录这些模块内容的校验信息

它们不是重复,而是分工不同。

go.mod 负责什么

go.mod 更像是项目依赖声明:

  • 当前模块名是什么
  • 当前 Go 版本是什么
  • 依赖了哪些模块
  • 是否存在 replaceexclude 之类的规则

go.sum 负责什么

go.sum 更像校验账本。

当 Go 下载依赖时,会把模块内容对应的哈希写进去。后面再次获取依赖时,Go 会校验实际拿到的内容是否和历史记录一致。

为什么不要手动乱改 go.sum

很多时候 go.sum 的变化只是因为:

  • 下载了新依赖
  • go mod tidy 清理了无用项
  • 间接依赖版本发生变化

通常更好的做法不是手动改,而是:

1go mod tidy

我的复盘

真正理解这两个文件之后,很多看起来神秘的现象就不神秘了。以后看到 go.sum 变化,我会先从依赖下载与校验角度看,而不是把它当成多余噪音。