まとめ
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 }
この例ではコンマ区切りで文字を読み込む。戻り値は順に、何文字スキャンしたかの文字数、スキャンした文字の配列、エラー。