github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/io/io.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package io は基本的なI/Oプリミティブに対するインターフェースを提供します。 6 // その主な役割は、パッケージosなどの既存の実装を共有の公開インターフェースにラップすることで、 7 // 機能を抽象化し、関連するプリミティブを提供することです。 8 // 9 // これらのインターフェースとプリミティブは、低レベルの操作をさまざまな実装でラップするため、 10 // 明示的に指示がない限り、クライアントは並行実行には安全ではないと想定すべきではありません。 11 package io 12 13 import ( 14 "github.com/shogo82148/std/errors" 15 ) 16 17 // 値の発見を求める。 18 const ( 19 SeekStart = 0 20 SeekCurrent = 1 21 SeekEnd = 2 22 ) 23 24 // ErrShortWriteは、要求されたバイト数よりも少ないバイト数の書き込みを受け付けたが、 25 // 明示的なエラーを返すことができなかったことを意味します。 26 var ErrShortWrite = errors.New("short write") 27 28 // ErrShortBuffer は、読み込みに提供されたバッファよりも長いバッファが必要だったことを意味します。 29 var ErrShortBuffer = errors.New("short buffer") 30 31 // EOFは、入力がもう利用できない場合にReadが返すエラーです。 32 // (EOF自体ではなく、EOFをラップしたエラーを返すのではなく、 33 // EOFをテストするために呼び出し元で==を使用するためです。) 34 // 関数は、入力の優雅な終了を示すために、EOFのみを返すべきです。 35 // もしEOFが構造化されたデータストリームで予期しない場所で発生した場合、 36 // 適切なエラーは [ErrUnexpectedEOF] またはその他の詳細を示すエラーです。 37 var EOF = errors.New("EOF") 38 39 // ErrUnexpectedEOFは、固定サイズのブロックまたはデータ構造の読み取り途中にEOFが出現したことを意味します。 40 var ErrUnexpectedEOF = errors.New("unexpected EOF") 41 42 // ErrNoProgressは、一部の [Reader] のクライアントがデータやエラーを返さずに、 43 // 複数回のRead呼び出しが失敗した場合に返されます。 44 // 通常は、破損した [Reader] の実装を示しています。 45 var ErrNoProgress = errors.New("multiple Read calls return no data or error") 46 47 // Readerは基本的なReadメソッドをラップするインターフェースです。 48 // Readは最大でlen(p)バイトをpに読み込みます。読み込んだバイト数(0 <= n <= len(p))と遭遇したエラーを返します。Readがn < len(p)を返しても、呼び出し中にp全体を作業領域として使用する場合があります。データが利用可能であるがlen(p)バイトでない場合、Readは通常、追加のデータを待つ代わりに利用可能なデータを返します。 49 // Readがn > 0バイトの読み込みに成功した後にエラーやファイルの終わりの状態に遭遇すると、読み込んだバイト数を返します。同じ呼び出しから(nilではない)エラーを返すことも、次の呼び出しからエラー(およびn == 0)を返すこともあります。入力ストリームの終わりで非ゼロのバイト数を返すReaderのインスタンスは、err == EOFまたはerr == nilのいずれかを返す場合があります。次のReadは0, EOFを返すべきです。 50 // 呼び出し元は、n > 0バイトが返される前にエラーerrを処理する必要があります。これにより、いくつかのバイトを読んだ後に発生するI/Oエラーや、許可されるEOFの両方の動作が正しく処理されます。 51 // len(p) == 0の場合、Readは常にn == 0を返すべきです。EOFなどのエラー条件が既知の場合、非nilのエラーを返す場合があります。 52 // Readの実装は、len(p) == 0の場合を除き、0バイトカウントとnilエラーを返すことは避けるべきです。呼び出し元は、0とnilの返り値は何も発生しなかったことを示しており、特にEOFを示しているわけではないと扱うべきです。 53 // 実装はpを保持してはいけません。 54 type Reader interface { 55 Read(p []byte) (n int, err error) 56 } 57 58 // Writerは基本的なWriteメソッドを包むインターフェースです。 59 // 60 // Writeはpから基礎となるデータストリームにlen(p)バイトを書き込みます。 61 // それはpから書き込まれたバイト数(0 <= n <= len(p))と、 62 // 書き込みが早期に停止させたエラーを返します。 63 // Writeは、n < len(p)の場合には非nilのエラーを返さなければなりません。 64 // Writeは、スライスデータを一時的にでも変更してはいけません。 65 // 66 // 実装はpを保持してはいけません。 67 type Writer interface { 68 Write(p []byte) (n int, err error) 69 } 70 71 // Closerは基本のCloseメソッドをラップするインターフェースです。 72 // 73 // 最初の呼び出し後のCloseの振る舞いは未定義です。 74 // 特定の実装は独自の振る舞いを文書化することがあります。 75 type Closer interface { 76 Close() error 77 } 78 79 // Seekerは基本のSeekメソッドをラップするインターフェースです。 80 // Seekは、オフセットを次のReadまたはWriteのために設定します。 81 // whenceに従って解釈されます。 82 // [SeekStart] はファイルの先頭を基準とします。 83 // [SeekCurrent] は現在のオフセットを基準とします。 84 // [SeekEnd] は末尾を基準とします。 85 // (例えば、offset = -2はファイルの最後から1つ前のバイトを指定します)。 86 // Seekは、ファイルの先頭を基準とした新たなオフセットまたはエラーを返します。 87 // ファイルの先頭より前のオフセットにシークすることはエラーです。 88 // 任意の正のオフセットにシークすることは許可されるかもしれませんが、 89 // 新しいオフセットが基になるオブジェクトのサイズを超える場合、 90 // その後のI/O操作の振る舞いは実装に依存します。 91 type Seeker interface { 92 Seek(offset int64, whence int) (int64, error) 93 } 94 95 // ReadWriterは基本的なReadとWriteメソッドをグループ化するインターフェースです。 96 type ReadWriter interface { 97 Reader 98 Writer 99 } 100 101 // ReadCloserは基本的なReadとCloseメソッドをまとめるインターフェースです。 102 type ReadCloser interface { 103 Reader 104 Closer 105 } 106 107 // WriteCloserは基本的なWriteとCloseメソッドをグループ化するインターフェースです。 108 type WriteCloser interface { 109 Writer 110 Closer 111 } 112 113 // ReadWriteCloserは、基本的なRead、Write、Closeメソッドをグループ化するインタフェースです。 114 type ReadWriteCloser interface { 115 Reader 116 Writer 117 Closer 118 } 119 120 // ReadSeekerは、基本的なReadとSeekメソッドをグループ化するインターフェースです。 121 type ReadSeeker interface { 122 Reader 123 Seeker 124 } 125 126 // ReadSeekCloserは、基本的なRead、Seek、Closeメソッドをグループ化するインターフェースです。 127 type ReadSeekCloser interface { 128 Reader 129 Seeker 130 Closer 131 } 132 133 // WriteSeekerは基本的なWriteとSeekメソッドをグループ化するインターフェースです。 134 type WriteSeeker interface { 135 Writer 136 Seeker 137 } 138 139 // ReadWriteSeekerは基本的なRead、Write、Seekメソッドをグループ化するインターフェースです。 140 type ReadWriteSeeker interface { 141 Reader 142 Writer 143 Seeker 144 } 145 146 // ReaderFromはReadFromメソッドをラップするインターフェースです。 147 // 148 // ReadFromはエラーが発生するか、EOFに到達するまでrからデータを読み取ります。 149 // 返り値のnは読み取られたバイト数です。 150 // 読み取り中にEOF以外のエラーも返されます。 151 // 152 // [Copy] 関数は [ReaderFrom] が利用可能な場合に使用します。 153 type ReaderFrom interface { 154 ReadFrom(r Reader) (n int64, err error) 155 } 156 157 // WriterToはWriteToメソッドをラップするインタフェースです。 158 // 159 // WriteToはデータを書き込み、書き込むデータがなくなるか 160 // エラーが発生するまでwに書き込みます。戻り値nは書き込まれた 161 // バイト数です。書き込み中にエラーが発生した場合はそれも返されます。 162 // 163 // Copy関数は利用可能であればWriterToを使用します。 164 type WriterTo interface { 165 WriteTo(w Writer) (n int64, err error) 166 } 167 168 // ReaderAtは基本的なReadAtメソッドをラップするインターフェースです。 169 // 170 // ReadAtは、基になる入力ソースのオフセットoffから始まるpにlen(p)バイトを読み込みます。 171 // 読み込まれたバイト数(0 <= n <= len(p))と、エラーが発生した場合のエラーを返します。 172 // 173 // ReadAtがn < len(p)を返す場合、なぜ追加のバイトが返されなかったかを説明する非nilのエラーが返されます。 174 // この点で、ReadAtはReadよりも厳格です。 175 // 176 // ReadAtがn < len(p)を返す場合でも、呼び出し中にpをスクラッチ領域として使用することがあります。 177 // データが一部利用可能であるがlen(p)バイトではない場合、ReadAtはすべてのデータが利用可能になるかエラーが発生するまでブロックされます。 178 // この点で、ReadAtはReadと異なります。 179 // 180 // ReadAtが返すn = len(p)バイトが入力ソースの末尾にある場合、ReadAtはerr == EOFまたはerr == nilのどちらかを返す可能性があります。 181 // 182 // ReadAtがシークオフセットを持つ入力ソースから読み込んでいる場合、 183 // ReadAtは基になるシークオフセットに影響を与えないし、影響を受けません。 184 // 185 // ReadAtのクライアントは、同じ入力ソースに対して並行してReadAt呼び出しを実行できます。 186 // 187 // 実装はpを保持してはいけません。 188 type ReaderAt interface { 189 ReadAt(p []byte, off int64) (n int, err error) 190 } 191 192 // WriterAtは基本的なWriteAtメソッドをラップするインターフェースです。 193 // 194 // WriteAtはpからlen(p)バイトを下層のデータストリームのoffセットに書き込みます。 195 // 書き込まれたバイト数n(0 <= n <= len(p))と書き込みが早期に終了した原因となった 196 // エラーが返されます。もしn < len(p)なら、WriteAtは非nilのエラーを返さなければなりません。 197 // 198 // もしWriteAtがseekオフセットを持つ宛先に書き込みを行っている場合、 199 // WriteAtは下層のseekオフセットに影響を与えず、また影響を受けてはいけません。 200 // 201 // WriteAtのクライアントは、範囲が重ならない場合には同じ宛先で並列して 202 // WriteAt呼び出しを実行することができます。 203 // 204 // 実装はpを保持してはいけません。 205 type WriterAt interface { 206 WriteAt(p []byte, off int64) (n int, err error) 207 } 208 209 // ByteReaderはReadByteメソッドをラップするインターフェースです。 210 // 211 // ReadByteは入力から次のバイトを読み取り、それを返します。 212 // エラーが発生した場合、入力バイトは消費されず、返されるバイト値は未定義です。 213 // 214 // ReadByteはバイト単位の効率的な処理を提供します。 215 // ByteReaderを実装していない [Reader] は、bufio.NewReaderを使用してこのメソッドを追加することができます。 216 type ByteReader interface { 217 ReadByte() (byte, error) 218 } 219 220 // ByteScannerは、基本のReadByteメソッドにUnreadByteメソッドを追加するインターフェースです。 221 // 222 // UnreadByteは、次のReadByte呼び出しで最後に読み込まれたバイトを返します。 223 // 最後の操作がReadByteへの成功した呼び出しでない場合、UnreadByteはエラーを返す可能性があります。 224 // 最後に読み込まれたバイト(または最後に読み込まれていないバイトの前のバイト)を未読状態に戻すか、 225 // ([Seeker] インターフェースをサポートする実装の場合)現在のオフセットの1バイト前にシークします。 226 type ByteScanner interface { 227 ByteReader 228 UnreadByte() error 229 } 230 231 // ByteWriterはWriteByteメソッドをラップするインターフェースです。 232 type ByteWriter interface { 233 WriteByte(c byte) error 234 } 235 236 // RuneReaderはReadRuneメソッドをラップするインターフェースです。 237 // 238 // ReadRuneは単一のエンコードされたUnicode文字を読み取り、 239 // その文字とバイトサイズを返します。文字が利用できない場合、errが設定されます。 240 type RuneReader interface { 241 ReadRune() (r rune, size int, err error) 242 } 243 244 // RuneScannerは基本のReadRuneメソッドにUnreadRuneメソッドを追加するインターフェースです。 245 // 246 // UnreadRuneは次のReadRune呼び出しで最後に読み取られたルーンを返します。 247 // もし最後の操作が成功したReadRune呼び出しでない場合、UnreadRuneはエラーを返す、最後に読み取られたルーン(または最後に未読となったルーンの前のルーン)を未読扱いにする、 248 // または([Seeker] インターフェースをサポートする実装の場合)現在のオフセットの直前のルーンの先頭にシークする可能性があります。 249 type RuneScanner interface { 250 RuneReader 251 UnreadRune() error 252 } 253 254 // StringWriterは、WriteStringメソッドを包んでいるインターフェースです。 255 type StringWriter interface { 256 WriteString(s string) (n int, err error) 257 } 258 259 // WriteStringはstring sの内容をバイトスライスを受け取るwに書き込みます。 260 // もしwが [StringWriter] を実装している場合は、 [StringWriter.WriteString] が直接呼び出されます。 261 // そうでない場合は、 [Writer.Write] が一度だけ呼び出されます。 262 func WriteString(w Writer, s string) (n int, err error) 263 264 // ReadAtLeastは、rからbufに少なくともminバイト読み取るまで読み取ります。 265 // 読み取られたバイト数と、読み取りが少なかった場合のエラーを返します。 266 // エラーがEOFの場合、読み取られたバイトがない場合のみです。 267 // minバイト未満の読み取り後にEOFが発生した場合、ReadAtLeastは [ErrUnexpectedEOF] を返します。 268 // minがbufの長さよりも大きい場合、ReadAtLeastは [ErrShortBuffer] を返します。 269 // 戻り値のn >= min if and only if err == nil。 270 // rが少なくともminバイトを読み取った後にエラーが発生した場合、エラーは破棄されます。 271 func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) 272 273 // ReadFullはrからbufにちょうどlen(buf)バイト読み込みます。 274 // 読み込まれたバイト数と、読み込まれたバイト数が少なかった場合のエラーが返されます。 275 // エラーは、バイトが一つも読み込まれなかった場合にのみEOFです。 276 // 一部のバイトが読み込まれた後にEOFが発生した場合、ReadFullは [ErrUnexpectedEOF] を返します。 277 // 返り値では、n == len(buf)であるのはerr == nilの場合のみです。 278 // rが少なくともlen(buf)バイトを読み込んだ後にエラーが発生した場合、そのエラーは無視されます。 279 func ReadFull(r Reader, buf []byte) (n int, err error) 280 281 // CopyNはsrcからdstにnバイト(またはエラーになるまで)をコピーします。 282 // コピーされたバイト数とコピー中に最初に遭遇したエラーが返されます。 283 // コピーが完了し、エラーがない場合、written == nが成り立ちます。 284 // 285 // もしdstが [ReaderFrom] インターフェースを実装している場合、 286 // そのインターフェースを使用してコピーが実装されます。 287 func CopyN(dst Writer, src Reader, n int64) (written int64, err error) 288 289 // CopyはsrcからdstにEOFに到達するか、エラーが発生するまでコピーします。コピーされたバイト数と最初に遭遇したエラーが返されます。 290 // 成功したコピーではerr == nilを返します。err == EOFではありません。 291 // CopyはsrcからEOFに到達するまで読み取るように定義されているため、ReadからのEOFは報告されるエラーではありません。 292 // 293 // srcが [WriterTo] インターフェースを実装している場合、コピーはsrc.WriteTo(dst)の呼び出しで実装されます。 294 // それ以外の場合、dstが [ReaderFrom] インターフェースを実装している場合、コピーはdst.ReadFrom(src)の呼び出しで実装されます。 295 func Copy(dst Writer, src Reader) (written int64, err error) 296 297 // CopyBuffer は Copy と同じですが、一時的なバッファを割り当てる代わりに、 298 // 提供されたバッファを使用してステージングします(必要な場合)。buf が nil の場合、一時的なバッファが割り当てられます。 299 // もし buf の長さがゼロなら、CopyBuffer はパニックを引き起こします。 300 // 301 // もし src が [WriterTo] を実装しているか、dst が [ReaderFrom] を実装している場合、 302 // コピーを実行するために buf は使用されません。 303 func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) 304 305 // LimitReaderは、rから読み取るReaderを返します。 306 // しかし、nバイト後にEOFで停止します。 307 // 内部の実装は*LimitedReaderです。 308 func LimitReader(r Reader, n int64) Reader 309 310 // LimitedReaderはRから読み込みますが、返されるデータ量をNバイトに制限します。Readの各呼び出しは、新しい残りの量を反映するためにNを更新します。また、N <= 0または基になるRがEOFを返す場合に、ReadはEOFを返します。 311 type LimitedReader struct { 312 R Reader 313 N int64 314 } 315 316 func (l *LimitedReader) Read(p []byte) (n int, err error) 317 318 // NewSectionReaderは、rからオフセットoffで読み取りを開始し、nバイト後にEOFで停止する [SectionReader] を返します。 319 func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader 320 321 // SectionReaderは、元となる [ReaderAt] の一部に対してRead、Seek、ReadAtを実装します。 322 type SectionReader struct { 323 r ReaderAt 324 base int64 325 off int64 326 limit int64 327 n int64 328 } 329 330 func (s *SectionReader) Read(p []byte) (n int, err error) 331 332 func (s *SectionReader) Seek(offset int64, whence int) (int64, error) 333 334 func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error) 335 336 // Size はセクションのサイズをバイト単位で返します。 337 func (s *SectionReader) Size() int64 338 339 // Outerは、セクションの下位の [ReaderAt] とオフセットを返します。 340 // 341 // 返される値は、[SectionReader] が作成されたときに 342 // [NewSectionReader] に渡されたものと同じです。 343 func (s *SectionReader) Outer() (r ReaderAt, off int64, n int64) 344 345 // OffsetWriterは、基準オフセットから基準オフセット+オフセットの範囲で下位のライターへの書き込みをマッピングします。 346 type OffsetWriter struct { 347 w WriterAt 348 base int64 349 off int64 350 } 351 352 // NewOffsetWriterは、オフセットoffから書き込む [OffsetWriter] を返します。 353 func NewOffsetWriter(w WriterAt, off int64) *OffsetWriter 354 355 func (o *OffsetWriter) Write(p []byte) (n int, err error) 356 357 func (o *OffsetWriter) WriteAt(p []byte, off int64) (n int, err error) 358 359 func (o *OffsetWriter) Seek(offset int64, whence int) (int64, error) 360 361 // TeeReaderは、rから読み取ったものをwに書き込む [Reader] を返します。 362 // これを通じて実行されるrからの全ての読み取りは、 363 // 対応するwへの書き込みとマッチングされます。 364 // 内部バッファリングはありません - 365 // 読み取りが完了する前に書き込みが完了する必要があります。 366 // 書き込み中にエラーが発生した場合、読み取りエラーとして報告されます。 367 func TeeReader(r Reader, w Writer) Reader 368 369 // Discardは、何もせずにすべての書き込み呼び出しに成功する [Writer] です。 370 var Discard Writer = discard{} 371 372 // discardは、最適化としてReaderFromを実装しています。そのため、io.DiscardへのCopyに不要な作業を避けることができます。 373 var _ ReaderFrom = discard{} 374 375 // NopCloser は、提供された [Reader] r を包む、Close メソッドの動作がない [ReadCloser] を返します。 376 // r が [WriterTo] を実装している場合、返された [ReadCloser] は [WriterTo] を実装し、 377 // 呼び出しを r に転送します。 378 func NopCloser(r Reader) ReadCloser 379 380 // ReadAllはrからエラーまたはEOFが発生するまで読み取り、読み取ったデータを返します。 381 // 成功した呼び出しではerr == nil、err == EOFではありません。ReadAllはsrcからEOFが発生するまで読み取るように定義されているため、ReadからのEOFはエラーとして報告されません。 382 func ReadAll(r Reader) ([]byte, error)