標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

("bufio".Reader) ReadString('\n') と ("bufio".Scanner) Scan() の違い

違い

  • ("bufio".Reader) ReadString('\n')
    • 改行をカットしない
  • ("bufio".Scanner) Scan()
    • 改行をカットする

改行コードのない最終行の扱い

最後の行が abcd(EOF) というテキストの場合

  • ("bufio".Reader) ReadString('\n')
    • "abcd",io.EOF という戻り値となる
  • ("bufio".Scanner) Scan()
    • Text() は "abcd" という戻り値を返し、そのScan() が false になる

Scanner の方は定番である

for sc.Scan() {
   line := sc.Text()
   fmt.Println(line)
}

という書き方で問題ないが、Reader の方は

for{
    line,err := r.ReadString('\n')
    if err != nil {
        break
    }
    fmt.Print(line)
}

だと、最後の行が抜けてしまう。

for{
    line,err := r.ReadString('\n')
    fmt.Print(line)
    if err != nil {
        break
    }
}

と書かないといけない。こう書くと Scanner の方が常に正しいように思われるが、Scanner は最終行の改行の有無がわからないという問題がある。