最轻量可靠的方式是先用os.stat比较文件大小,相等后再用os.readfile读取并用bytes.equal比较字节切片;大文件应改用sha256流式哈希;行级差异优先用go-difflib;二进制文件可调用cmp/fc命令快速定位差异。

用 os.Stat 和 bytes.Equal 快速判断两个文件是否完全一致
多数场景下,你并不需要逐行或逐字节输出差异,而只是想知道“这两个文件内容一样吗”。这时候最轻量、最可靠的方式是先比大小,再比内容。
- 先调用
os.Stat检查两个文件的Size(),不等直接返回 false —— 避免读取大文件浪费内存 - 大小相等时,用
os.ReadFile一次性读入(适合 ≤100MB 的文件),再用bytes.Equal比较字节切片 - 注意:Windows 下路径大小写不敏感,但
os.Open仍按实际路径找文件;若需跨平台一致行为,建议提前 normalize 路径
对大文件做分块哈希比对,避免内存爆炸
当文件可能超过几百 MB,os.ReadFile 会把整个文件加载进内存,容易触发 OOM。这时应改用流式处理 + 哈希摘要。
- 用
sha256.New()创建哈希器,配合io.Copy边读边计算,单次只读 32KB(bufio.NewReaderSize(f, 32768)) - 不要用
md5—— 在校验场景下 SHA256 更抗碰撞,且 Go 标准库中性能差距可忽略 - 两次独立计算哈希值再比较,比直接逐块比对更鲁棒:即使某次读取因 I/O 错误中断,也能明确失败而非静默错判
需要行级差异时,别自己写 diff,用 github.com/pmezard/go-difflib
Go 标准库没有内置 diff 工具,硬实现 LCS(最长公共子序列)既易出错又难优化。社区成熟的 go-difflib 足够应对绝大多数文本文件比对需求。
- 它输出格式兼容 GNU diff,支持
DiffLines(按行)、DiffBytes(按字节)两种模式 - 注意:传入的两组字符串切片必须是
[]string,不是单个string;常见错误是忘记strings.Split(string(content), "\n") - 若文件含 Windows 换行符(
\r\n),建议先统一 normalize 成\n,否则空行或结尾换行差异会被放大为多处“变更”
二进制文件不能按行 diff,但可以用 cmp 命令辅助调试
当你怀疑两个二进制文件(如图片、PDF、编译产物)有细微差异,又不想写完整解析逻辑,本地快速验证非常实用。
- Go 程序里调用系统
cmp命令(Unix/macOS)或fc(Windows)是最省事的 fallback 方案 - 用
exec.Command("cmp", "-l", path1, path2)获取第一个不同字节的位置和值,比全量哈希更快定位问题 - 注意:
cmp输出是八进制偏移+字节值,解析时别漏掉strings.Fields后的类型转换;Windows 上fc默认文本模式,加/b参数才做二进制比对
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











