GolangのScannerを使って文字列の読み込みをやってみた

まとめ

Scanner作成

scanner := bufio.NewScanner(strings.NewReader("123\n456"))

io.Readerを実装していればなんでもOK。

SplitFuncの設定

scanner.Split(bufio.ScanWords)

※デフォルトでは行単位で読み込む設定になっているので、設定を変えたくないならやらなくていい。

SplitFuncはScannerが読み込む単位を設定する関数。行単位とか、単語単位とか。デフォルトでいくつかの関数が用意されている。

文字の読み込み

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
}

この例ではコンマ区切りで文字を読み込む。戻り値は順に、何文字スキャンしたかの文字数、スキャンした文字の配列、エラー。

SplitFunc

書いてみたソース全部