【问题标题】:Golang filepath.Walk panic error on large directoryGolang filepath.Walk 在大目录上出现恐慌错误
【发布时间】:2016-02-18 17:28:33
【问题描述】:

我正在尝试浏览 C 盘上的所有文件告诉 walk 函数返回一个 nil 错误代码。

package files

import (
   "path/filepath"
   "os"
   "fmt"
 )

func walkpath(path string, f os.FileInfo, err error) error {
    fmt.Printf("%s with %d bytes\n", path,f.Size())
    return nil
}

func GetFiles() {
    err := filepath.Walk("C:\\", walkpath)
    if err != nil {
        fmt.Printf(err.Error())
    }
}

紧急错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x40 pc=0x46d0d6]

goroutine 1 [running]:
files.walkpath(0xc0820a8f80, 0xf, 0x0, 0x0, 0x664270, 0xc082408840, 0x0, 0x0)
        C:/project/src/files/files.go:11 +0x66
path/filepath.walk(0x529140, 0x3, 0x6641e8, 0xc082012240, 0x560d50, 0x0, 0x0)
        c:/go/src/path/filepath/path.go:370 +0x41c
path/filepath.Walk(0x529140, 0x3, 0x560d50, 0x0, 0x0)
        c:/go/src/path/filepath/path.go:396 +0xe8
files.GetFiles()
        C:/project/src/files/files.go:22 +0xc9
main.main()
        c:/project/src/main.go:12 +0x49
exit status 2

c:\project>go build c:\project\src\main.go

https://gobyexample.com/panic

您如何处理运行时发生的错误?

谢谢!

【问题讨论】:

  • 查看这篇文章; blog.golang.org/defer-panic-and-recover 有一种常见的恐慌/恢复模式可以使用。但是,每个错误都是不同的。你的是什么意思?如果您要说打开一个不存在的目录或您没有权限,则恢复只会将执行控制权返回到您的代码中,它不会解决目录不存在的问题,所以您必须对失败时应该发生什么做出一些决定。
  • 另外,如果您需要列出非常大的目录,请参阅stackoverflow.com/questions/34513460/…

标签: go panic


【解决方案1】:

您没有检查错误,而是尝试在 nil os.FileInfo 接口上调用方法:

func walkpath(path string, f os.FileInfo, err error) error {
    if err != nil {
        fmt.Println(err)
    } else {    
        fmt.Printf("%s with %d bytes\n", path,f.Size())
    }
    return nil
}

如果你想在运行时处理panic,你可以使用recover。然而,这应该是意外恐慌的最后手段。 panic 通常是由于编程错误,旨在使程序崩溃。

【讨论】:

  • 我遇到了这个。如果 err 不为零,则取消引用 f 是不安全的。 invalid memory address or nil pointer dereference - 通常意味着 f 为零。但在这种情况下,这是因为当 err 不是 nil 时,f 恰好是无法取消引用的垃圾。即:指向不再有效的指针,或具有奇怪值的指针,如“2”或“-5”等。
猜你喜欢
  • 1970-01-01
  • 2015-03-29
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2017-05-12
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多