Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 列出文件夹内容时出错_Go - Fatal编程技术网

Go 列出文件夹内容时出错

Go 列出文件夹内容时出错,go,Go,使用Go1.8.1,我试图编写一些处理文件的东西。问题是,虽然filepath.Walk(…)工作正常,但我需要一些更灵活的东西。因此,我转向ioutil.ReadDir(…),只看到一个壮观的“panic:runtime error:invalid memory address或nil pointer dereference”。我尝试过其他方法(filepath.Glob(…),file.Readdirnames(…)),它们都会导致相同的错误。 真正令人费解的是filepath.Walk(…

使用Go1.8.1,我试图编写一些处理文件的东西。问题是,虽然
filepath.Walk(…)
工作正常,但我需要一些更灵活的东西。因此,我转向
ioutil.ReadDir(…)
,只看到一个壮观的“
panic:runtime error:invalid memory address或nil pointer dereference
”。我尝试过其他方法(
filepath.Glob(…)
file.Readdirnames(…)
),它们都会导致相同的错误。 真正令人费解的是
filepath.Walk(…)
使用
os.Lstat(…)
,但当我尝试直接使用
os.Lstat(…)
时。。。我得到了上面同样的错误。 我在更新的Ubuntu16.04LTS和更新的Fedora25上试过这个,没有什么不同

我的Go-fu真的很弱(这是我除了“hello world”之外的第一个应用程序),所以非常感谢您的帮助

以下是一些失败的代码:

func glob() {
    infos, err := filepath.Glob("*")
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}

func y() {
    file, err := os.Open(folder)
    println(file.Name())
    defer file.Close()
    infos, err := file.Readdirnames(0)
    //infos, err := ioutil.ReadDir(folder)
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}

func readDir() {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}
以下是有效的方法:

func walk() {
    err := filepath.Walk(folder, printWalk)
    if err != nil {
        log.Fatal(os.Stderr, "walk failed with error: %v\n", err)
    }
}

func printWalk(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }
    fmt.Println("path:", path, "FileInfo.Name:", info.Name())
    return nil
}

你的
err
检查向后看我。我原以为:

func readDir() {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        log.Fatal(err)
    }
    for _, info := range infos {
        fmt.Println(info)
    }
}
将文件夹作为参数并返回任何错误的更惯用的版本是:

func readDir(folder string) error {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        return err
    }
    for _, info := range infos {
        fmt.Println(info)
    }
    return nil
}

你检查错误了

if err != nil {  // if there is an error (!)
    // do something (as if there was no error)
} else {
    log.Fatal(err.Error()) // the dereference happens here, where err == nil.
}

你能发布一些代码吗?你能用这些代码更新/编辑你的问题吗?愚蠢的问题:看看
文件夹
是一个全局变量,它有可能在
readDir
func调用之前没有被初始化吗?不太可能。如果我直接替换为字符串,它仍然失败。它是初始化的,因为y()打印它的值。我正要建议更正
err
check@peterSO谢谢,我的错误是认为
infos
在出现错误时对范围不安全。我只是想帮忙。