Go言語のbufio.Scannerには容量があるぞ!

January 08, 2021

最近競プロを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()

まとめ

  • 容量に気をつけよう。
  • 公式ドキュメントとソースコードはちゃんと読もう。

Written by aimof
Goプログラマ。PythonやJSなどもちょくちょく触る。最近はGatsbyのカスタマイズが楽しい。 Twitter