Go中删除文件或目录需用os.Remove(删单个文件或空目录,非空目录报错)和os.RemoveAll(递归删整个目录树,路径不存在也不报错);建议删除前用os.Stat检查路径类型与存在性,并注意符号链接和跨平台行为。
在 Go 语言中删除文件或目录,主要依靠 os 包提供的 Remove 和 RemoveAll 两个函数。它们用途不同、行为有别,用错容易导致程序 panic 或误删内容。
os.Remove 用于删除指定路径的文件,或**空的目录**。如果目标是**非空目录**,调用会返回 os.ErrInvalid(具体错误类型为 *os.PathError,底层 errno 通常是 ENOTEMPTY)。
使用时需注意:
os.ErrNotExist
os.ErrPermission
示例:
err := os.Remove("config.json")os.RemoveAll 是更“强力”的删除方式:它会删除指定路径及其所有子目录和文件,无论是否为空。适合清理临时目录、缓存目录或测试生成的整个输出结构。
它的行为特点:
nil
示例:
err := os.RemoveAll("build/")
if err != nil {虽然 Remove 和 RemoveAll 本身会返回错误,但提前判断可让逻辑更清晰、提示更友好。
常用检查方式:
os.Stat 获取文件信息,再通过 fi.IsDir() 判断是否为目录errors.Is(err, os.ErrNotExist) 区分“不存在”和其他错误例如:
fi, err := os.Stat("data/")Go 的 os.Remove 和 RemoveAll 在 Windows/macOS/Linux 上语义一致,但要注意:
/ 即可(Go 内部自动适配),无需手动调用 filepath.Join,但拼接路径时仍推荐使用它保证健壮性ERROR_SHARING_VIOLATION),需确保无句柄打开安全拼接示例:
path := filepath.Join("temp", "cache.db")