You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何高效遍历指定顶级目录(dev、prod)

更优的Go目录遍历实现方案

咱们直接针对你的核心需求来优化——既然你明确只需要遍历dev和prod这两个顶级目录的所有内容,完全不用先遍历整个根目录再过滤,直接指定目标目录进行遍历会更高效、逻辑更清晰。

推荐方案:直接指定目标目录遍历

这个方案完全贴合你的需求,不需要处理根目录下的其他无关文件/目录,代码简洁且性能更优:

package main

import (
	"log"
	"os"
	"path/filepath"
)

func main() {
	// 明确列出需要遍历的目标目录,完全匹配你的核心需求
	targetDirs := []string{"./dev", "./prod"}

	for _, dir := range targetDirs {
		// 提前检查目录是否存在,避免无效遍历
		if _, err := os.Stat(dir); os.IsNotExist(err) {
			log.Printf("目录 %s 不存在,跳过遍历", dir)
			continue
		}

		// 使用 Go 1.16+ 推荐的 filepath.WalkDir(性能优于旧版 Walk)
		err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
			if err != nil {
				log.Printf("遍历路径 %s 时出错: %v", path, err)
				return err
			}

			// 在这里添加你的业务逻辑,比如打印路径、处理文件等
			log.Println("当前遍历到:", path)
			return nil
		})

		if err != nil {
			log.Fatalf("遍历目录 %s 失败: %v", dir, err)
		}
	}
}

这个方案的优势:

  • 精准匹配需求:直接指定dev和prod,不需要处理根目录下的.git、CODEOWNER、README等无关内容,避免了多余的过滤逻辑
  • 性能更优:WalkDir比旧版的Walk效率更高,它返回轻量的fs.DirEntry,避免了每次调用都创建os.FileInfo对象
  • 扩展性强:如果以后需要添加更多需要遍历的目录,只需要在targetDirs切片中新增条目即可
  • 错误处理完善:提前检查目录是否存在,遍历过程中也能捕获并处理异常

备选方案:从根目录过滤目标目录

如果你需要保留“从根目录扫描并过滤”的逻辑(比如不确定目标目录名称,但知道要排除.git和非目录文件),也可以优化你的原有代码,同时增加更严谨的过滤:

package main

import (
	"log"
	"os"
	"path/filepath"
)

func main() {
	// 使用 os.ReadDir 替代已过时的 ioutil.ReadDir(Go 1.16+ 推荐)
	entries, err := os.ReadDir("./")
	if err != nil {
		log.Fatal(err)
	}

	for _, entry := range entries {
		// 跳过非目录、.git 隐藏目录
		if !entry.IsDir() || entry.Name() == ".git" {
			continue
		}
		// 额外添加判断,只保留 dev 和 prod,避免根目录新增其他目录时被误遍历
		if entry.Name() != "dev" && entry.Name() != "prod" {
			continue
		}

		err := filepath.WalkDir(entry.Name(), func(path string, d os.DirEntry, err error) error {
			if err != nil {
				log.Printf("遍历路径 %s 出错: %v", path, err)
				return err
			}
			log.Println("当前遍历到:", path)
			return nil
		})

		if err != nil {
			log.Fatalf("遍历目录 %s 失败: %v", entry.Name(), err)
		}
	}
}

优化点说明:

  • 用os.ReadDir替代了已标记为过时的ioutil.ReadDir
  • 增加了明确的dev/prod判断,避免根目录新增其他目录时被误处理
  • 使用WalkDir提升遍历性能

总结

最推荐第一种方案,因为它完全贴合你的核心需求,代码逻辑最简单、效率最高,也最容易维护。

内容的提问来源于stack exchange,提问作者Abhishek Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:16:52