2017-05-14 137 views
0

使用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真的很弱(這是我的第一個應用程序,除了「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 
} 
+0

你能發表一些代碼嗎? – Tobias

+0

您能否使用該代碼更新/編輯您的問題? – Tobias

+0

愚蠢的問題:看看'文件夾'是一個全局變量,它可能沒有得到初始化'readDir'函數調用? – maksimov

回答

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 
} 
+0

剛剛建議糾正'錯誤'檢查 – maksimov

+0

複製/粘貼ftw。我現在不覺得愚蠢。 – AlexM

+0

@peterSO謝謝,我的錯誤是在考慮錯誤情況下'infos'是不安全的。只是試圖幫助。 – maksimov

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. 
} 
+0

我希望我能接受這兩個答案。 – AlexM