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 {
// エラーを返す
}