インタフェースとは
のチャプターではio.Readerとio.Writerを使った実装についての説明が出てくる。
io.Reader
io.Readerは以下のように超シンプルにRead()を持つだけ
type Reader interface {
Read(p []byte) (n int, err error)
}
- len(p)バイトまでをpに読み込み、読み込んだバイト数nとエラーerrを返す
- n > 0のとき、errはnilかio.EOFのどちらか
- 読み取り側がストリームの終端に到着すると、errにio.EOFが返される
- (n==0 && err==nil)の返却は禁止。なぜなら呼び出し側が無限ループになってしまうので
- Read()を実行しても(0, io.EOF)が返ってくることが判明している場合は、ブロックせずにそれを返すことはOK
- 内部に読み取る元データのサイズと現在のオフセットを持っているので、そこから最後に到達していると判断している場合など
- errがnilなら少なくとも1バイトは読み込まれていることが保証される
io.Writer
io.WriterもWrite()を持つだけ
type Writer interface {
Write(p []byte) (n int, err error)
}
- pから最大len(p)バイトを書き出し、書いたバイト数nとエラーerrを返す
- n < len(p)になった場合、errは必ずnon-nil
- n == len(p)かつerr == nilなら完全に成功
- errがnon-nilでも n > 0なら部分的に書き込みは成功している
- WriterにはEOFの概念はない
- n == 0 かつ err == nil は仕様上禁止