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 にする。