Go 我试图以广度优先的方式遍历文件结构。我越来越紧张了

Go 我试图以广度优先的方式遍历文件结构。我越来越紧张了,go,recursion,Go,Recursion,我知道关于ioutil.ReadDir和os.filePath的信息,但它们都没有以广度优先的方式遍历目录。 我的方法是调用ioutil.ReadDir并将根目录的所有内容附加到一个切片中。然后我迭代内容,检查它是否为IsDir[],如果为true,则递归调用函数 package main import ( "io/ioutil" "os" ) var files []string var path string func appendFiles(root string)

我知道关于
ioutil.ReadDir
os.filePath
的信息,但它们都没有以广度优先的方式遍历目录。 我的方法是调用
ioutil.ReadDir
并将根目录的所有内容附加到一个切片中。然后我迭代内容,检查它是否为
IsDir[]
,如果为true,则递归调用函数

package main

import (
    "io/ioutil"
    "os"
)

var files []string
var path string

func appendFiles(root string) {
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return
    }
    for _, file := range fileInfo {
        files = append(files, file.Name())
    }

    for _, file := range fileInfo {
        fileStat, _ := os.Stat(file.Name())
        if fileStat.Mode().IsDir() {
            // path = path + "/" + file.Name()
            appendFiles(file.Name())
        }
    }
}

func main() {

    appendFiles(".")
}
问题是可能会返回您忽略的
错误。当这种情况发生时,
fileStat
可能是
nil
,因此在下一行中调用
fileStat.Mode()

os.Stat()
失败的原因是
file.Name()
是相对于
root
file.Name()
本身几乎不可能存在,它必须与
root
连接。如果使用不存在的文件名调用
os.Stat()
,它将返回
nil
文件信息和非
nil
错误

您可以使用为
os.Stat()
将使用的文件构造有效路径。最好是处理错误,例如返回错误,您可以在
main()
中检查这些错误


请引用运行程序时获得的实际输出,另请参阅。关于您的代码,请确保它是一个。作为一个新用户,也可以使用。感谢您指出这一点。我会记住这一点。
func appendFiles(root string) error {
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return fmt.Errorf("ReadDir error: %w", err)
    }
    for _, file := range fileInfo {
        files = append(files, filepath.Join(root, file.Name()))
    }

    for _, file := range fileInfo {
        fullName := filepath.Join(root, file.Name())
        fileStat, err := os.Stat(fullName)
        if err != nil {
            return fmt.Errorf("Stat error: %w", err)
        }
        if fileStat.Mode().IsDir() {
            if err := appendFiles(fullName); err != nil {
                return fmt.Errorf("appendFiles error: %w", err)
            }
        }
    }
    return nil
}

func main() {
    if err := appendFiles("."); err != nil {
        fmt.Println(err)
    }
}