使用Go 1.8.1,我试图写一些处理文件的东西。问题是,虽然filepath.Walk(...)
工作正常,但我需要更灵活的东西。所以我转向ioutil.ReadDir(...)
,只是为了迎接一场壮观的" panic: runtime error: invalid memory address or nil pointer dereference
"。我尝试了替代方案(filepath.Glob(...)
,file.Readdirnames(...)
),它们都会导致同样的错误。
真正令人费解的是filepath.Walk(...)
使用os.Lstat(...)
,但当我尝试直接使用os.Lstat(...)
时...我得到了同样的错误。
我已经在更新的Ubuntu 16.04 LTS和更新的Fedora 25上尝试了这个,它没有任何区别。
我的Go-fu真的很弱(这是我的第一个应用程序除了"你好世界"),所以任何帮助都表示赞赏。
这里有一些失败的代码:
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
}
答案 0 :(得分:1)
您的err
支票向后看我。我原以为:
func readDir() {
infos, err := ioutil.ReadDir(folder)
if err != nil {
log.Fatal(err)
}
for _, info := range infos {
fmt.Println(info)
}
}
一个更为惯用的版本,其folder
作为参数并返回任何错误:
func readDir(folder string) error {
infos, err := ioutil.ReadDir(folder)
if err != nil {
return err
}
for _, info := range infos {
fmt.Println(info)
}
return nil
}
答案 1 :(得分:0)
您正在错误地检查错误。
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.
}