2016-02-18 3 views
1

Я пытаюсь пройти через все файлы на диске C, которые я читаю может быть неэффективным в Go, но я не могу понять, почему я продолжаю получать паническую ошибку, когда делая это, когда я говорю функции walk, чтобы вернуть код ошибки nil.Golang filepath.Walk паническая ошибка в большом каталоге

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:

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

Как вы обрабатывать ошибки, которые возникают во время выполнения?

Спасибо!

+0

Отметьте эту статью; http://blog.golang.org/defer-panic-and-recover существует общий панический/восстанавливающий шаблон, который используется. Однако каждая ошибка отличается. Что вы имеете в виду? Если вы пытаетесь открыть открытую директорию, которая не существует или у вас нет прав, восстановление приведет к простому управлению выполнением в ваш код, это не решит проблему отсутствия каталога, я должен принять некоторые решения о том, что должно произойти при неудаче. – evanmcdonnal

+0

Кроме того, если вам нужно перечислить очень большие каталоги, см. Http://stackoverflow.com/questions/34513460/efficiently-listing-files-in-a-directory-having-very-many -entries – JimB

ответ

2

Вы не проверять ошибки, и пытается вызвать метод на ноль 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. Однако это должно быть последним средством для неожиданной паники. A panic обычно происходит из-за ошибки программирования и предназначен для сбоя программы.

+0

Я столкнулся с этим. если err не равен нулю, тогда небезопасно разыгрывать f. 'недопустимый адрес памяти или разворот указателя nil' - обычно означает, что f будет nil. но в этом случае это происходит потому, что, когда err не является nil, f просто оказывается мусором, который вы не можете разыменовать. т.е. указатель на что-то более недействительное, или указатель со странным значением типа «2» или «-5» и т. д. – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^