2017-05-14 14 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」以外の私の最初のアプリケーションです)。

ここで失敗するいくつかのコードです:あなたのerrチェックは私に後方に見える

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

愚かな質問: 'folder'がどのようにグローバル変数であるかを見ると、' readDir'関数呼び出しの前に初期化されていない可能性がありますか? – maksimov

答えて

1

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 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

'err'チェックの修正を提案しようとしていたところ – 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

関連する問題