質問: byte('b') return 2, nil } func main() { io.CopyN(os.Stdout, new(stream), 5) // panic: runtime error: index out of range } ``` 環境:go version go1.10.3 windows/386
回答: 自己回答です。(metropolisさんのコメントから) `io.CopyN` 関数は、受け取った `io.Reader` を `io.LimitedReader` でラップしてから `io.Copy` に渡してコピーしています。 今回の例ですと、`io.LimitedReader` はラップした `io.Reader` から、以下のバッファサイズでreadします。 * 1回目のread:5バイト(そして2バイト読み込む) * 2回目のread:3バイト(そして2バイト読み込む) * 3回目のread:1バイト 3回目のreadではバッファサイズは1バイトであるため、`p[1]` にアクセスしようとして `index out of range` が発生します。 正しくは、受け取ったバッファ `p` が必要なサイズを満たしているかどうかをチェックするべきです。