首页 > 解决方案 > GoLang 打印目录树

问题描述

我在 Go 中创建递归函数以打印包含所有子目录和文件的目录时遇到问题。我在将当前文件或目录保存到结果时遇到了一些问题。以下代码仅打印 0 级目录。

func ListTree(path string, level int) (result string, err error) {
    files, err := ioutil.ReadDir(path)
    if err != nil {
        return result, err
    }
    for idx, entry := range files {
        result += fmt.Sprintf("\n%v/%v", MultiplyElement("\t", level), entry.Name())
        if entry.IsDir() {
            ListTree(path + "/" + entry.Name(),level+1)
        }
    }
    return result, err
}

但是,当我在函数外部声明结果变量时(我知道那是糟糕的代码,仅用于测试)它工作得很好,但是在调用函数后结果值没有被清除。

var result string
func ListTree(path string, level int) (string, error) {
    files, err := ioutil.ReadDir(path)
    if err != nil {
        return result, err
    }
    for idx, entry := range files {
        result += fmt.Sprintf("\n%v/%v", MultiplyElement("\t", level), entry.Name())
        if entry.IsDir() {
            ListTree(path + "/" + entry.Name(),level+1)
        }
    }
    return result, err
}

我该如何解决这个问题?

标签: go

解决方案


在第一个代码示例中,您以ListTree递归方式调用但不使用其返回值,因此在级别 > 0 的调用计算和返回的任何内容都被丢弃在地板上。

相反,请尝试:

result += ListTree(path + "/" + entry.Name(),level+1)

或者,使用filepath.Walk遍历目录树。


推荐阅读