Go

EOFをチェックするより前に読んだデータを処理しよう

More than 3 years have passed since last update.

GoのIO関係の関数は、読んだデータの長さとエラーの両方を同時に返す。もしデータの長さが0でなければ、エラーがあったとしても、読んだぶんはきちんと処理しなければいけない。たとえば次のようなコードは間違いだ。

n, err := r.Read(buf)
if err != nil {
    // エラーを返す
}
// buf[:n]を処理

上のようなコードだと、3とEOFが返ってきたようなときに、一番最後の3バイトを取りこぼすことになる。正しくは下のような順番で書かないといけない。

n, err := r.Read(buf)
// buf[:n]を処理
if err != nil {
    // エラーを返す
}