まとめ
Scanner作成
scanner := bufio.NewScanner(strings.NewReader("123\n456"))
io.Readerを実装していればなんでもOK。
SplitFuncの設定
scanner.Split(bufio.ScanWords)
※デフォルトでは行単位で読み込む設定になっているので、設定を変えたくないならやらなくていい。
SplitFuncはScannerが読み込む単位を設定する関数。行単位とか、単語単位とか。デフォルトでいくつかの関数が用意されている。
- https://golang.org/pkg/bufio/#ScanBytes
- https://golang.org/pkg/bufio/#ScanLines
- https://golang.org/pkg/bufio/#ScanRunes
- https://golang.org/pkg/bufio/#ScanWords
文字の読み込み
for scanner.Scan() {
fmt.Println(scanner.Text())
}
ScanメソッドでSplitFuncに基づいた文字の境界位置までスキャンする。その後にText()メソッドでスキャンした文字を取得する。
SplitFuncのカスタマイズ
func(data []byte, atEOF bool) (advance int, token []byte, err error) {
for i := 0 ; i < len(data) ; i++ {
if data[i] == ',' {
return i + 1, data[:i], nil
}
}
return 0, data, bufio.ErrFinalToken
}
この例ではコンマ区切りで文字を読み込む。戻り値は順に、何文字スキャンしたかの文字数、スキャンした文字の配列、エラー。