推荐用 os.ReadDir 读单层目录(Go 1.16+ 替代 ioutil.ReadDir),高效轻量;递归遍历用 filepath.Walk,自动深度扫描并支持回调过滤;注意权限错误处理、隐藏文件判断及跨平台路径拼接。
使用 Go 语言遍历目录并读取文件列表,最常用且推荐的方式是
(Go 1.16+ 已弃用,应改用
)或更底层的
。下面直接讲清楚怎么用、该选哪个、注意什么。
用 os.ReadDir 读取单层目录内容(推荐)
是 Go 1.16 引入的轻量级替代方案,比旧版
更高效,不加载完整文件信息(如内容),只读取目录项元数据。
它返回
,每个条目支持快速判断是否为目录或文件(
)
不递归,只读当前目录一级
按文件系统顺序返回,如需排序需自行调用
示例:
用 filepath.Walk 递归遍历整个目录树
当需要深度扫描子目录(比如查找所有 .go 文件),用
最直接。它自动递归,并对每个路径调用
回调函数
。
立即学习
“
go语言免费学习笔记(深入)
”;
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
回调函数签名:
可通过
区分目录/文件;若为目录且想跳过其子项,可返回
注意:它会进入符号链接指向的目录(除非你手动跳过)
示例:列出所有 .txt 文件路径
避免踩坑的几个关键点
在 Go 1.16+ 已被标记为 deprecated,新项目请统一用
和
都不会自动处理权限错误(如无读取权限的子目录),遇到时回调中
,需显式检查并决定是否继续
如果要过滤隐藏文件(以
开头),需手动判断
(注意空名和 Windows 兼容性)
路径拼接务必用
,别用字符串 +,否则跨平台出错
简单封装一个安全的递归文件收集函数
如果你常做类似操作,可以封装一个带错误处理和扩展名过滤的小工具:
调用:
基本上就这些。不用第三方库,
标准库
已足够健壮。选
做单层,选
做递归,注意错误处理和路径安全,就稳了。
ioutil.ReadDiros.ReadDirfilepath.Walkos.ReadDirioutil.ReadDir[]fs.DirEntry.IsDir()sort.Slicepackage main
import (
"fmt"
"os"
)
func main() {
entries, err := os.ReadDir("./mydir")
if err != nil {
panic(err)
}
for _, entry := range entries {
if entry.IsDir() {
fmt.Printf("DIR %s\n", entry.Name())
} else {
fmt.Printf("FILE %s\n", entry.Name())
}
}
}filepath.Walkfunc(path string, info fs.FileInfo, err error) errorinfo.IsDir()filepath.SkipDirerr := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && filepath.Ext(path) == ".txt" {
fmt.Println(path)
}
return nil
})ioutil.ReadDiros.ReadDiros.ReadDirfilepath.Walkerr != nil.entry.Name()[0] == '.'filepath.Joinfunc WalkFiles(root string, exts ...string) ([]string, error) {
var files []string
extSet := make(map[string]bool)
for _, e := range exts {
extSet[strings.ToLower(e)] = true
}
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil // 忽略权限错误,继续遍历
}
if !info.IsDir() {
ext := strings.ToLower(filepath.Ext(path))
if len(exts) == 0 || extSet[ext] {
files = append(files, path)
}
}
return nil
})
return files, err
}goFiles, _ := WalkFiles("./src", ".go")os.ReadDirfilepath.Walk