Golang Filepath.Walk在大型目录上出现恐慌错误

bud*_*dge 2 go panic

我想通过C盘,我阅读上的所有文件走路可以在围棋是低效的,但我不能工作了这样做的时候,我告诉步行函数返回一个零错误代码,为什么我总是收到一个严重错误。

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())
    }
}
Run Code Online (Sandbox Code Playgroud)

紧急错误:

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
Run Code Online (Sandbox Code Playgroud)

https://gobyexample.com/panic

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

谢谢!

Jim*_*imB 5

您没有检查错误,而是尝试在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
}
Run Code Online (Sandbox Code Playgroud)

如果要panic在运行时处理,可以使用recover。但是,这应该是意外恐慌的最后手段。A panic通常是由于编程错误引起的,并且意在使程序崩溃。