推荐用 os.Stat 配合 os.IsNotExist 判断文件是否存在:os.Stat 成功则存在;失败时 os.IsNotExist(err) 为 true 表示不存在,否则可能是权限等问题。

在Go语言中判断文件是否存在,最常用且推荐的方式是使用 os.Stat 配合错误判断,而不是依赖 os.IsNotExist 的字面含义做逻辑分支——因为它的语义其实是“检查错误是否表示文件不存在”,而非直接返回布尔值。
用 os.Stat + error 判断文件是否存在
os.Stat 会尝试获取文件的元信息(如大小、权限、修改时间等)。如果文件存在,返回 nil 错误;如果不存在或无权限访问,则返回非 nil 错误。关键点在于:不能只看错误是否为 nil,而要具体判断错误类型。
- 调用
os.Stat(path),若返回 err == nil → 文件存在(且可访问) - 若 err != nil,再用
os.IsNotExist(err)判断是否因“不存在”导致失败 - 其他 err(如 permission denied)说明文件可能存在但不可读,需按业务需求处理
避免常见误区:不要用 os.IsExist
os.IsExist 在 Go 1.13+ 已被标记为 deprecated(弃用),它原本用于判断“文件已存在”的错误(比如 os.Create 时文件已存在),但语义易混淆,且不适用于 Stat 场景。实际开发中几乎不用它来检测文件是否存在。
✅ 正确写法:
立即学习“go语言免费学习笔记(深入)”;
if _, err := os.Stat("config.json"); os.IsNotExist(err) {// 文件不存在
}
封装成可复用函数
把判断逻辑抽成函数更清晰、安全:
func FileExists(path string) bool {if _, err := os.Stat(path); err != nil {
return os.IsNotExist(err) == false // 注意:IsNotExist(err)==false 表示“不是不存在”,即存在或有其他错误
}
return true // Stat 成功 → 存在
}
更严谨的版本会区分“存在但无权限”和“确实不存在”,可根据需要返回三态结果(存在 / 不存在 / 访问失败)。
补充:检查目录是否存在也用 os.Stat
判断目录是否存在的方法完全一样——os.Stat 对目录同样有效。若需进一步确认是目录而非普通文件,可结合 fi.IsDir():
// 是一个存在的目录
}
基本上就这些。核心就一条:用 os.Stat + os.IsNotExist 组合,简洁、可靠、符合 Go 的错误处理哲学。










