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)