Go 言語で String#eachや IO#eachみたいなことをしたい
忘れがちなので自分用メモ。
string に対して
package main import ( "bufio" "fmt" "strings" ) func main() { var src string = "foo\nbar\nbaz\n" var reader *strings.Reader = strings.NewReader(src) // strings.Reader は io.Reader を実装しているので… var scanner *bufio.Scanner = bufio.NewScanner(reader) for scanner.Scan() { fmt.Println(scanner.Text()) } }
実行結果
foo bar baz
File に対して
package main import ( "bufio" "fmt" "os" ) func main() { var scanner *bufio.Scanner = bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) } // エラー処理はこう。ループのあとでやる。 if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "Error: ", err) } }
入力
hoge piyo fuga
実行結果
hoge piyo fuga
まとめ
io.Reader に仕立てあげて、そいつを bufio.Scanner にする。