Go 列出文件夹内容时出错
使用Go1.8.1,我试图编写一些处理文件的东西。问题是,虽然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(…
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
在出现错误时对范围不安全。我只是想帮忙。