Go言語のWalkでファイルを再帰的に走査

Go言語のWalkについて

Go言語における「Walk」は、ファイルシステムを再帰的に走査するために使用される便利な関数です。
これは、標準ライブラリの os パッケージに含まれている filepath.Walk 関数のことを指します。
filepath.Walk は指定されたディレクトリツリー内のすべてのファイルとサブディレクトリを訪問し、それぞれに対して指定された関数を実行します。
これにより、ファイルシステムの探索や操作が簡単に行えます。

filepath.Walk 関数の基本的な使い方を見ていきましょう。
関数のシグネチャは次のようになっています。

func Walk(root string, walkFn WalkFunc) error

ここで、root は探索を開始するディレクトリのパスを指定する文字列です。
walkFn は、ディレクトリツリーの各ファイルやディレクトリに対して呼び出されるコールバック関数です。
WalkFunc の定義は次のようになります。

type WalkFunc func(path string, info os.DirEntry, err error) error

WalkFunc は、3つの引数を受け取ります。
path は現在処理中のファイルまたはディレクトリのパス、info はそのエントリに関する情報、err はそのエントリに関連するエラー情報です。
WalkFunc はエラーを返すことができ、このエラーが非 nil の場合、Walk 関数の実行が中止されます。

具体的な使用例を見てみましょう。
次のコードは、指定されたディレクトリ内のすべてのファイルのパスを表示する例です。

package main

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

func main() {
  root := "." // 現在のディレクトリから探索を開始

  err := filepath.Walk(root, func(path string, info os.DirEntry, err error) error {
    if err != nil {
      return err
    }
    fmt.Println(path)
    return nil
  })

  if err != nil {
    fmt.Printf("エラーが発生しました: %v\n", err)
  }
}

このコードでは、filepath.Walk を使用して現在のディレクトリ(".")から再帰的に探索を開始し、各ファイルやディレクトリのパスを表示しています。
コールバック関数内でエラーが発生した場合、そのエラーを返すことで、探索処理を中止することもできます。

filepath.Walk は再帰的なファイル探索に非常に便利ですが、注意が必要です。
ディレクトリツリーが非常に深い場合や、多くのファイルが含まれている場合、メモリ使用量や処理速度に影響を与える可能性があります。
また、ディレクトリ内のファイルやディレクトリの数が多い場合、I/O 操作の遅延が発生する可能性もあります。

filepath.Walk によって、ファイルシステムの構造を操作したり、ファイルの内容を読み取ったりする処理を簡単に実装できますが、効率的に使用するためには、エラー処理やパフォーマンスの最適化に留意することが重要です。