PythonのfileinputをGoで実装してみた
Pythonの○○をGoで実装してみたシリーズ
fileinputは、行単位で処理を行うコマンド(特にUNIXフィルタ)を作るときなどに便利なライブラリ。
import fileinput for line in fileinput.input(): process(line)
- コマンドライン引数で与えられたファイルの行に順番にアクセス
- 引数が空の場合は標準出力の行にアクセス
- ファイル名として '-' が与えられたときも標準出力の行にアクセス
使用例
sc := fileinput.Lines(os.Args[1:]) for sc.Scan() { process(sc.Text()) // 行を処理 } if sc.Err() != nil { os.Stderr.WriteString(sc.Err().Error() + "\n") os.Exit(1) } // なお、ファイルハンドラを閉じる処理は.Scan()や.Err()の中で自動で行われる
Python版との違い
Go版はbufio.Scannerを真似たインターフェースにしました。 そのため、Pythonほどシンプルではありません(Pythonはfor文に渡すだけで使えるが、Go版は覚えるべきメソッドが3つもある)。
行をchan string
で返せば、Python版に近い書き心地になるような気もしましたが、
標準に合わせたいことと、チャネルを返そうとするとGoroutineを1つ余分に消費してしまうことがあり、
あきらめました。
#リハビリを兼ねて、チョチョイと書くつもりが、なぜか半日もかかってしまった・・・