0

0

Go语言如何遍历目录_ioutil ReadDir与os ReadDir用法

P粉602998670

P粉602998670

发布时间:2026-01-21 00:59:13

|

987人浏览过

|

来源于php中文网

原创

Go 1.16+ 应使用 os.ReadDir 替代已移除的 ioutil.ReadDir;它返回轻量级 fs.DirEntry,需显式调用 Info() 获取完整元数据;递归遍历应优先选用 filepath.WalkDir。

go语言如何遍历目录_ioutil readdir与os readdir用法

Go 1.16+ 应该用 os.ReadDirioutil.ReadDir 已被移除(它在 Go 1.16 被彻底弃用,且早在 Go 1.15 就已标记为 deprecated)。

为什么不能用 ioutil.ReadDir

ioutil 包在 Go 1.16 中被整体废弃,所有功能迁入 ioos 等标准包。试图使用 ioutil.ReadDir 会直接报错:

undefined: ioutil.ReadDir

这不是版本兼容问题,而是 API 移除 —— 即使你用 Go 1.15,也应避免新代码中使用它。

os.ReadDir 返回 []fs.DirEntry,不是 []os.FileInfo

os.ReadDir 返回的是轻量级的 fs.DirEntry 接口,它只保证提供文件名和是否为目录等基础信息,不强制读取完整元数据(比如修改时间、大小),因此比旧版 os.ReadDir(返回 []os.FileInfo)更快、更省内存。

立即学习go语言免费学习笔记(深入)”;

如果你需要完整文件信息(如 ModTime()Size()),得显式调用 .Info()

entries, err := os.ReadDir("/path")
if err != nil {
    log.Fatal(err)
}
for _, entry := range entries {
    info, err := entry.Info() // 这里才触发系统调用读取完整 stat
    if err != nil {
        log.Printf("failed to get info for %s: %v", entry.Name(), err)
        continue
    }
    fmt.Printf("%s, size: %d, isDir: %t\n", entry.Name(), info.Size(), info.IsDir())
}

常见误操作:直接对 entry 调用 entry.Size()entry.ModTime() —— 这些方法不存在,fs.DirEntry 只有 Name()IsDir()Type()Info()

Detect GPT
Detect GPT

一个Chrome插件,检测您浏览的页面是否包含人工智能生成的内容

下载

递归遍历推荐用 filepath.WalkDir,不是手写循环

单纯一层目录用 os.ReadDir 足够;但要递归遍历(类似 find . -type f),优先选 filepath.WalkDir —— 它内部使用 os.ReadDir,支持按需跳过子树、错误恢复、且不会因深层嵌套导致溢出。

关键点:

  • filepath.WalkDir回调函数接收 fs.DirEntry,同样需调用 .Info() 获取完整信息
  • 返回 filepath.SkipDir 可跳过当前目录(不进入其子目录)
  • 遇到权限错误等,不会中断整个遍历,而是继续处理其他路径

示例:只打印所有普通文件路径

err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
        return nil // 忽略访问错误(如 permission denied)
    }
    if !d.IsDir() {
        fmt.Println(path)
    }
    return nil
})
if err != nil {
    log.Fatal(err)
}

兼容旧代码?别硬套,重写成本很低

如果老项目还在用 os.Stat + os.ReadDir(返回 []os.FileInfo),不要试图“兼容”两种接口。直接替换为 os.ReadDir + 按需 .Info() 即可 —— 大多数场景下,你其实并不需要每项的完整 os.FileInfo,只判断是否为目录或获取文件名就够了。

真正容易被忽略的是:递归遍历时,filepath.WalkDir 的错误处理粒度比 filepath.Walk 更细,且默认不 panic;而很多人仍习惯性用已废弃的 filepath.Walk(它底层用 os.Lstat + os.Readdir,性能较差且无法跳过子树)。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1027

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

454

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

446

2023.09.25

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号