🗽

【Go】bufio::Scanner でスキャンできるトークンのサイズには上限がある

に公開

なので、bufio::MaxScanTokenSize以上のトークンをスキャンする場合はbufio::Scanner.Bufferで上限を変更しよう。

エラーハンドリング

もしトークンのサイズが大きい場合、bufio::Scanner.Errでエラーを取得できる。

token := make([]byte, 128*1024)
sc := bufio.NewScanner(bytes.NewReader(token))

fmt.Println(sc.Scan()) // false

if err := sc.Err(); err != nil {
    fmt.Println(err) // bufio.Scanner: token too long
}

fmt.Printf("token size: %d\n", len(sc.Bytes())) // token size: 0

また失敗しても再度スキャンを実行することができ、その場合は続きからスキャンを始める。

token := make([]byte, 128*1024)
sc := bufio.NewScanner(bytes.NewReader(token))

fmt.Println(sc.Scan()) // false

if err := sc.Err(); err != nil {
    fmt.Println(err) // bufio.Scanner: token too long
}

fmt.Printf("token size: %d\n", len(sc.Bytes())) // token size: 0

fmt.Println(sc.Scan()) // true
fmt.Printf("token size: %d\n", len(sc.Bytes())) // token size: 65536

おわり

AtCoderの初心者用演習がずっと通らなくて頭を悩ませていたけどこんなハマりどころがあるとは…

リンク

https://pkg.go.dev/bufio

https://atcoder.jp/contests/abs/tasks/arc065_a

Discussion