🗽
【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の初心者用演習がずっと通らなくて頭を悩ませていたけどこんなハマりどころがあるとは…
リンク
Discussion