最近競プロをGo言語で軽く触っています、aimofです。 問題を解いている最中にbufio.Scannerの挙動で詰まったので備忘録がてらメモを残しておきます。
bufio.Scannerには容量がある
すごく当たり前のことなのですが、bufio.Scannerには容量があります。ReaderにもWriterにもあります。
容量を超えたio.ReaderをScanしようとすると、すべて読み取ることができません。
初期値は4096Byteなので、長いテキストを読み込む場合にはBufferの量を増やす必要があります。
今回の問題では、2*10^5
でした。
悪い例
b := bufio.NewScanner(os.Stdin)
b.Scan()
良い例
b := bufio.NewScanner(os.Stdin)
b.Buffer(make([]byte, 0, 1000000), 1000000)
b.Scan()
まとめ
- 容量に気をつけよう。
- 公式ドキュメントとソースコードはちゃんと読もう。