os.Stat获取符号链接指向的目标文件信息,os.Lstat获取符号链接自身元数据;二者均返回os.FileInfo接口,需检查错误并用其方法提取Name、Size、Mode、ModTime等信息。

在 Go 中获取文件信息,主要靠 os.Stat 和 os.Lstat 两个函数。它们都返回 os.FileInfo 接口,但行为关键不同:一个“穿透”符号链接,一个“停在”符号链接本身。
os.Stat:获取目标文件的真实信息
os.Stat 会自动解析路径中的符号链接,最终返回链接指向的**实际文件或目录**的信息。这是最常用的方式,适合绝大多数场景——比如判断某路径是否为普通文件、获取大小、修改时间等。
- 如果路径不存在或权限不足,返回
error(如os.ErrNotExist) - 如果路径是符号链接,它不返回链接自身的元数据,而是返回链接所指对象的元数据
- 示例:
os.Stat("/usr/bin/python")在大多数 Linux 系统上会返回/usr/bin/python3或真实二进制文件的信息,而非软链接本身的属性
os.Lstat:获取符号链接自身的信息
os.Lstat 不解析符号链接,直接读取该路径**作为链接项**的元数据。只有当你需要检查链接是否存在、谁创建了它、它的原始大小(通常是路径字符串长度)或是否真的是个链接时,才用它。
- 能准确识别出一个路径是不是符号链接(
fi.Mode()&os.ModeSymlink != 0) - 对不存在的路径同样返回错误;但对损坏的悬空链接(dangling symlink),它仍可成功返回链接自身的 info
- 示例:
os.Lstat("/usr/bin/python")可能返回一个ModeSymlink类型的FileInfo,且Size()返回的是链接目标路径字符串的字节数(如"../bin/python3"的长度)
如何安全使用 Stat/Lstat:记得检查错误
这两个函数都可能失败,不能忽略返回的 error。常见做法是先调用,再用类型断言或错误比较做分支处理。
立即学习“go语言免费学习笔记(深入)”;
- 用
errors.Is(err, os.ErrNotExist)判断路径不存在(推荐,兼容不同系统) - 用
os.IsPermission(err)判断权限拒绝 - 不要直接写
if err != nil就 panic,尤其在服务端或 CLI 工具中应友好提示 - 若需同时知道是否为链接又想获取真实信息,可先
Lstat判断类型,再按需Stat
FileInfo 能拿到哪些关键信息?
无论 Stat 还是 Lstat,返回的 os.FileInfo 都提供统一接口:
-
Name():不含路径的文件名(注意不是完整路径) -
Size():普通文件字节数;目录在不同系统表现不一;符号链接返回目标路径长度 -
Mode():包含类型(文件/目录/链接/设备等)和权限位,可用Mode().IsDir()、Mode().IsRegular()、Mode()&os.ModeSymlink != 0判断 -
ModTime():最后修改时间(time.Time) -
IsDir()等是便捷方法,内部就是对Mode()的封装
基本上就这些。记住核心区别:Stat 看“背后的东西”,Lstat 看“表面的样子”。用对函数,再结合 FileInfo 方法,就能稳稳拿到你需要的文件信息。










