Documentation
¶
Overview ¶
Package bufio はバッファードI/Oを実装しています。io.Readerまたはio.Writerオブジェクトをラップして、 バッファリングやテキストI/Oのための支援を提供する別のオブジェクト(ReaderまたはWriter)を作成します。
Index ¶
- Constants
- Variables
- func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)
- func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error)
- func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error)
- func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error)
- type ReadWriter
- type Reader
- func (b *Reader) Buffered() int
- func (b *Reader) Discard(n int) (discarded int, err error)
- func (b *Reader) Peek(n int) ([]byte, error)
- func (b *Reader) Read(p []byte) (n int, err error)
- func (b *Reader) ReadByte() (byte, error)
- func (b *Reader) ReadBytes(delim byte) ([]byte, error)
- func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
- func (b *Reader) ReadRune() (r rune, size int, err error)
- func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
- func (b *Reader) ReadString(delim byte) (string, error)
- func (b *Reader) Reset(r io.Reader)
- func (b *Reader) Size() int
- func (b *Reader) UnreadByte() error
- func (b *Reader) UnreadRune() error
- func (b *Reader) WriteTo(w io.Writer) (n int64, err error)
- type Scanner
- type SplitFunc
- type Writer
- func (b *Writer) Available() int
- func (b *Writer) AvailableBuffer() []byte
- func (b *Writer) Buffered() int
- func (b *Writer) Flush() error
- func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)
- func (b *Writer) Reset(w io.Writer)
- func (b *Writer) Size() int
- func (b *Writer) Write(p []byte) (nn int, err error)
- func (b *Writer) WriteByte(c byte) error
- func (b *Writer) WriteRune(r rune) (size int, err error)
- func (b *Writer) WriteString(s string) (int, error)
Examples ¶
Constants ¶
const ( // MaxScanTokenSizeは、トークンをバッファリングするために使用される最大サイズです // ユーザーが [Scanner.Buffer] で明示的なバッファを提供しない限り。 // 実際の最大トークンサイズは、バッファに改行などを含める必要があるため、より小さくなる場合があります。 MaxScanTokenSize = 64 * 1024 )
Variables ¶
var ( ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte") ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune") ErrBufferFull = errors.New("bufio: buffer full") ErrNegativeCount = errors.New("bufio: negative count") )
var ( ErrTooLong = errors.New("bufio.Scanner: token too long") ErrNegativeAdvance = errors.New("bufio.Scanner: SplitFunc returns negative advance count") ErrAdvanceTooFar = errors.New("bufio.Scanner: SplitFunc returns advance count beyond input") ErrBadReadCount = errors.New("bufio.Scanner: Read returned impossible count") )
Scannerが返すエラー。
var ErrFinalToken = errors.New("final token")
ErrFinalTokenは、特別なセンチネルエラー値です。 スキャンをエラーなしで停止することを示すために、Split関数によって返されることを意図しています。 このエラーと一緒に配信されるトークンがnilでない場合、トークンは最後のトークンです。
この値は、処理を早期に停止する必要がある場合や、最後の空のトークン(nilトークンとは異なる)を配信する必要がある場合に役立ちます。 カスタムエラー値で同じ動作を実現できますが、ここで提供することで整理されたコードになります。 この値の使用例については、emptyFinalTokenの例を参照してください。
Functions ¶
func ScanLines ¶ added in v1.1.0
ScanLinesは、改行マーカー以降のテキストが除かれた、 Scanner のスプリット関数です。 返される行は空になる場合もあります。 改行マーカーは1つのオプションのキャリッジリターンに続いて1つの必須の改行からなります。 正規表現の表記では、 `\r?\n`です。 入力の最後の非空行は改行がない場合でも返されます。
Types ¶
type ReadWriter ¶
ReadWriterは Reader と Writer へのポインタを保存します。 io.ReadWriter を実装します。
func NewReadWriter ¶
func NewReadWriter(r *Reader, w *Writer) *ReadWriter
NewReadWriterはrとwにディスパッチする新しい ReadWriter を割り当てます。
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
Readerはio.Readerオブジェクトに対してバッファリングを実装します。
func NewReaderSize ¶
NewReaderSizeは、バッファの最低限のサイズが指定された新しい Reader を返します。 もし引数のio.Readerが既に十分なサイズの Reader であれば、それは基本となる Reader を返します。
func (*Reader) Discard ¶ added in v1.5.0
Discard は次の n バイトをスキップし、スキップしたバイト数を返します。
もし Discard が n バイト未満をスキップした場合、エラーも返します。 もし 0 <= n <= b.Buffered() のとき、Discard は io.Reader の下の方から読み取らずに必ず成功することが保証されています。
func (*Reader) Peek ¶
Peek returns the next n bytes without advancing the reader. The bytes stop being valid at the next read call. If Peek returns fewer than n bytes, it also returns an error explaining why the read is short. The error is ErrBufferFull if n is larger than b's buffer size.
Calling Peek prevents a Reader.UnreadByte or Reader.UnreadRune call from succeeding until the next read operation.
func (*Reader) Read ¶
Readはデータをpに読み込みます。 pに読み込まれたバイト数を返します。 バイトは基礎となる Reader のReadから最大1つ取り出されますので、nはlen(p)より少ない場合があります。 len(p)バイトを正確に読み取るには、io.ReadFull(b, p)を使用してください。 基礎となる Reader がio.EOFで非ゼロの数を返す可能性がある場合、このReadメソッドも同様です。詳細は io.Reader ドキュメントを参照してください。
func (*Reader) ReadBytes ¶
ReadBytesは入力内のデリミタの最初の出現まで読み取り、 データとデリミタを含むスライスを返します。 ReadBytesがデリミタを見つける前にエラーが発生した場合、 エラーが発生する前に読み取られたデータとエラー自体(通常はio.EOF)を返します。 Returned dataがデリミタで終わっていない場合、ReadBytesはerr != nilを返します。 簡単な使用のためには、Scannerがより便利です。
func (*Reader) ReadLine ¶
ReadLineは低レベルの行読み取りプリミティブです。ほとんどの呼び出し元は、 Reader.ReadBytes('\n') または Reader.ReadString('\n') を使用するか、 Scanner を使用する必要があります。
ReadLineは、改行文字を含まない1行だけを返そうとします。もし行がバッファーに対して長すぎる場合、isPrefixが設定され、行の先頭が返されます。それ以降の行は、将来の呼び出しで返されます。最後のフラグメントを返す際には、isPrefixはfalseになります。返されるバッファーは、次のReadLine呼び出しまでの間のみ有効です。ReadLineは、nilではない行を返すか、エラーを返すか、どちらかを返しますが、両方を返すことはありません。
ReadLineから返されるテキストには、行末の("\r\n"または"\n")は含まれません。入力が最後の行末で終わっている場合、特定の表示やエラーは与えられません。ReadLineの後に Reader.UnreadByte を呼び出すと、常に最後に読み取られたバイト(おそらく行末に属する文字)がアンリードされます。ただし、そのバイトがReadLineによって返された行の一部でない場合でもです。
func (*Reader) ReadRune ¶
ReadRuneは、1つのUTF-8エンコードされたユニコード文字を読み込み、 そのルーンとバイトサイズを返します。エンコードされたルーンが無効な場合は、1バイトを消費し、 サイズが1のunicode.ReplacementChar(U+FFFD)を返します。
func (*Reader) ReadSlice ¶
ReadSliceは入力内の最初のデリミタの出現まで読み取り、バッファ内のバイトを指すスライスを返します。 バイトは次の読み取り時には無効になります。 ReadSliceがデリミタを見つける前にエラーに遭遇した場合、バッファ内のすべてのデータとエラー自体(通常はio.EOF)を返します。 バッファがデリミタなしで満杯になると、ReadSliceは ErrBufferFull エラーで失敗します。 ReadSliceから返されるデータは次のI/O操作によって上書きされるため、ほとんどのクライアントは Reader.ReadBytes またはReadStringを代わりに使用すべきです。 ReadSliceは、lineの終了がデリミタでない場合にのみerr!= nilを返します。
func (*Reader) ReadString ¶
ReadStringは、入力内で最初のデリミタが現れるまで読み込み、デリミタを含むデータの文字列を返します。 ReadStringがデリミタを見つける前にエラーに遭遇した場合、エラー自体(通常はio.EOF)とエラーが発生する前に読み取ったデータを返します。 ReadStringは、返されたデータの最後がデリミタで終わっていない場合、err != nilを返します。 単純な使用法の場合は、Scannerがより便利です。
func (*Reader) Reset ¶ added in v1.2.0
Resetはバッファに保持されたデータを破棄し、すべての状態をリセットし、 バッファリーダーをrから読み取るように切り替えます。 Reader のゼロ値に対してResetを呼び出すと、内部バッファがデフォルトのサイズに初期化されます。 b.Reset(b)(つまり、Reader を自身にリセットする)は何もしません。
func (*Reader) UnreadByte ¶
UnreadByteは最後のバイトを未読状態に戻します。直前に読み込まれたバイトのみが未読状態に戻すことができます。
UnreadByteは、Reader に対して最後に呼び出されたメソッドが読み込み操作ではない場合にエラーを返します。特に、 Reader.Peek 、 Reader.Discard 、および Reader.WriteTo は読み込み操作とはみなされません。
func (*Reader) UnreadRune ¶
UnreadRuneは最後のルーンを戻します。もし、 Reader に最も最近呼び出されたメソッドが Reader.ReadRune でない場合、 Reader.UnreadRune はエラーを返します。(この点で、 Reader.UnreadByte よりも厳格です。Reader.UnreadByte はどの読み取り操作からも最後のバイトを戻します。)
func (*Reader) WriteTo ¶ added in v1.1.0
WriteToはio.WriterToを実装します。 これは基礎となる Reader の Reader.Read メソッドを複数回呼び出すことがあります。 基礎となるreaderが Reader.WriteTo メソッドをサポートしている場合、 これはバッファリングせずに基礎となる Reader.WriteTo を呼び出します。
type Scanner ¶ added in v1.1.0
type Scanner struct {
// contains filtered or unexported fields
}
Scannerは、改行で区切られたテキストの行のファイルなどのデータを読み取るための便利なインターフェースを提供します。Scanメソッドの連続した呼び出しにより、ファイルの「トークン」を順番にステップし、トークン間のバイトをスキップします。トークンの仕様は SplitFunc 型の分割関数によって定義されます。デフォルトの分割関数は、入力を行に分割し、行末の文字を取り除きます。Scanner.Split 関数は、ファイルを行、バイト、UTF-8エンコードされたルーン、スペースで区切られた単語にスキャンするために、このパッケージで定義されています。クライアントは代わりにカスタムの分割関数を提供することもできます。
スキャンは、EOF、最初のI/Oエラー、または Scanner.Buffer に収まりきらないトークンで不可回復的に停止します。 スキャンが停止すると、リーダーは最後のトークンを超えて任意の距離を進めている可能性があります。 エラー処理や大きなトークンの制御が必要なプログラム、またはリーダーで連続的なスキャンを実行する必要があるプログラムは、 代わりに bufio.Reader を使用する必要があります。
Example (Custom) ¶
ScanWordsをラップして構築されたカスタム分割関数を使用するScannerを使用して、 32ビットの10進数入力を検証します。
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/strconv" "github.com/shogo82148/std/strings" ) func main() { // 人工的な入力ソース。 const input = "1234 5678 1234567901234567890" scanner := bufio.NewScanner(strings.NewReader(input)) // 既存のScanWords関数をラップして、カスタム分割関数を作成します。 split := func(data []byte, atEOF bool) (advance int, token []byte, err error) { advance, token, err = bufio.ScanWords(data, atEOF) if err == nil && token != nil { _, err = strconv.ParseInt(string(token), 10, 32) } return } // スキャン操作のための分割関数を設定します。 scanner.Split(split) // 入力を検証します。 for scanner.Scan() { fmt.Printf("%s\n", scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Printf("Invalid input: %s", err) } }
Output: 1234 5678 Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range
Example (EarlyStop) ¶
Use a Scanner with a custom split function to parse a comma-separated list with an empty final value but stops at the token "STOP".
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/bytes" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" "github.com/shogo82148/std/strings" ) func main() { onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) { i := bytes.IndexByte(data, ',') if i == -1 { if !atEOF { return 0, nil, nil } // If we have reached the end, return the last token. return 0, data, bufio.ErrFinalToken } // If the token is "STOP", stop the scanning and ignore the rest. if string(data[:i]) == "STOP" { return i + 1, nil, bufio.ErrFinalToken } // Otherwise, return the token before the comma. return i + 1, data[:i], nil } const input = "1,2,STOP,4," scanner := bufio.NewScanner(strings.NewReader(input)) scanner.Split(onComma) for scanner.Scan() { fmt.Printf("Got a token %q\n", scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading input:", err) } }
Output: Got a token "1" Got a token "2"
Example (EmptyFinalToken) ¶
空の最終値を持つカンマ区切りリストを解析するために、カスタム分割関数を使用するScannerを使用します。
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" "github.com/shogo82148/std/strings" ) func main() { // カンマ区切りのリスト。最後のエントリは空です。 const input = "1,2,3,4," scanner := bufio.NewScanner(strings.NewReader(input)) // コンマで区切る分割関数を定義します。 onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) { for i := 0; i < len(data); i++ { if data[i] == ',' { return i + 1, data[:i], nil } } if !atEOF { return 0, nil, nil } // 最後に配信されるトークンが1つあります。これが空の文字列である場合があります。 // ここでbufio.ErrFinalTokenを返すと、Scanにこれ以降のトークンがないことを伝えます。 // ただし、Scan自体からエラーが返されるわけではありません。 return 0, data, bufio.ErrFinalToken } scanner.Split(onComma) // Scan. for scanner.Scan() { fmt.Printf("%q ", scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading input:", err) } }
Output: "1" "2" "3" "4" ""
Example (Lines) ¶
Scannerの最も単純な使用方法は、標準入力を行のセットとして読み取ることです。
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" ) func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) // Printlnは最後の'\n'を追加します } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading standard input:", err) } }
Output:
Example (Words) ¶
スキャナを使用して、スペースで区切られたトークンのシーケンスとして入力をスキャンすることにより、 単純な単語カウントユーティリティを実装します。
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" "github.com/shogo82148/std/strings" ) func main() { // 人工的な入力ソース。 const input = "Now is the winter of our discontent,\nMade glorious summer by this sun of York.\n" scanner := bufio.NewScanner(strings.NewReader(input)) // スキャン操作のための分割関数を設定します。 scanner.Split(bufio.ScanWords) // 単語を数えます。 count := 0 for scanner.Scan() { count++ } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading input:", err) } fmt.Printf("%d\n", count) }
Output: 15
func NewScanner ¶ added in v1.1.0
func (*Scanner) Buffer ¶ added in v1.6.0
Bufferは、スキャン中に使用する初期バッファと、割り当て可能な最大バッファサイズを設定します。 最大トークンサイズは、maxとcap(buf)の大きい方よりも小さくなければなりません。 max <= cap(buf)の場合、 Scanner.Scan はこのバッファのみを使用し、割り当てを行いません。
デフォルトでは、Scanner.Scan は内部バッファを使用し、最大トークンサイズを MaxScanTokenSize に設定します。
Bufferはスキャンの開始後に呼び出された場合、パニックを発生させます。
func (*Scanner) Bytes ¶ added in v1.1.0
BytesはScanの呼び出しによって生成された最新のトークンを返します。 基になる配列は、後続の Scanner.Scan の呼び出しによって上書きされる可能性があります。 メモリ確保は行われません。
Example ¶
最新のScan呼び出しを[]byteとして返します。
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" "github.com/shogo82148/std/strings" ) func main() { scanner := bufio.NewScanner(strings.NewReader("gopher")) for scanner.Scan() { fmt.Println(len(scanner.Bytes()) == 6) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "shouldn't see an error scanning a string") } }
Output: true
func (*Scanner) Scan ¶ added in v1.1.0
Scanは、 Scanner.Bytes または Scanner.Text メソッドを介して利用可能な次のトークンに Scanner を進めます。 入力の終わりに到達するかエラーが発生すると、falseを返します。 Scanがfalseを返した後、 Scanner.Err メソッドはスキャン中に発生したエラーを返しますが、 エラーが[io.EOF]の場合、 Scanner.Err はnilを返します。 スキャンが進まずに空のトークンを多数返す場合、スキャナーはpanicします。 これは、スキャナーの一般的なエラーモードです。
func (*Scanner) Split ¶ added in v1.1.0
Splitは Scanner の分割関数を設定します。 デフォルトの分割関数は ScanLines です。
Splitはスキャンが開始された後に呼び出された場合、パニックを引き起こします。
func (*Scanner) Text ¶ added in v1.1.0
Textは Scanner.Scan の呼び出しで生成された最新のトークンを、そのバイトを保持する新しく割り当てられた文字列として返します。
type SplitFunc ¶ added in v1.1.0
SplitFuncは、入力をトークン化するために使用されるsplit関数のシグネチャです。 引数は、残りの未処理データの初期部分のサブストリングと、 Reader にもうデータがないことを報告するフラグであるatEOFです。 戻り値は、入力を進めるためのバイト数と、ユーザーに返す次のトークン(あれば)、およびエラー(あれば)です。
関数がエラーを返した場合、スキャンは停止します。この場合、入力の一部が破棄される可能性があります。 エラーが ErrFinalToken である場合、スキャンはエラーなしで停止します。 ErrFinalToken と一緒に非nilトークンが配信される場合、最後のトークンとなり、 ErrFinalToken と一緒にnilトークンが配信される場合、スキャンが直ちに停止します。
それ以外の場合、スキャナは入力を進めます。トークンがnilでない場合、スキャナはユーザーにそれを返します。トークンがnilの場合、スキャナはさらにデータを読み込んでスキャンを続けます。もしデータがもうない場合(つまり、atEOFがtrueの場合)、スキャナは終了します。データがまだ完全なトークンを保持していない場合、例えば改行がない場合は、 SplitFunc は(0、nil、nil)を返して Scanner にデータをスライスに読み込んで再試行するように指示できます。
この関数は、空のデータスライスでは呼び出されません(ただし、atEOFがtrueの場合は除く)。ただし、atEOFがtrueの場合、データが空でなく、常に未処理のテキストを保持しているかもしれません。
type Writer ¶
type Writer struct {
// contains filtered or unexported fields
}
Writerは io.Writer オブジェクトに対してバッファリングを行います。 Writer に書き込む際にエラーが発生した場合、以降のデータの受け入れや、 Writer.Flush メソッドの呼び出しはエラーを返します。 全てのデータが書き込まれた後、クライアントは Writer.Flush メソッドを呼び出して、全てのデータが基になる io.Writer に転送されることを保証する必要があります。
Example ¶
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" ) func main() { w := bufio.NewWriter(os.Stdout) fmt.Fprint(w, "Hello, ") fmt.Fprint(w, "world!") w.Flush() // フラッシュするのを忘れないで! }
Output: Hello, world!
func NewWriter ¶
NewWriterは、バッファのデフォルトサイズを持つ新しい Writer を返します。 引数のio.Writerが既に十分に大きなバッファサイズを持つ Writer である場合、基になる Writer を返します。
func NewWriterSize ¶
NewWriterSizeは、バッファのサイズが指定された最小値を持つ新しい Writer を返します。 引数のio.Writerがすでに十分な大きさを持つ Writer である場合、基になる Writer を返します。
func (*Writer) AvailableBuffer ¶ added in v1.18.0
AvailableBufferは、b.Available() 容量の空のバッファを返します。 このバッファは追加されることを意図しており、 直後の Writer.Write 呼び出しに渡されます。 このバッファは、b上の次の書き込み操作までの間のみ有効です。
Example ¶
package main import ( "github.com/shogo82148/std/bufio" "github.com/shogo82148/std/os" "github.com/shogo82148/std/strconv" ) func main() { w := bufio.NewWriter(os.Stdout) for _, i := range []int64{1, 2, 3, 4} { b := w.AvailableBuffer() b = strconv.AppendInt(b, i, 10) b = append(b, ' ') w.Write(b) } w.Flush() }
Output: 1 2 3 4
func (*Writer) ReadFrom ¶ added in v1.1.0
ReadFrom は io.ReaderFrom インターフェースを実装します。もし基礎となる書き込み先が ReadFrom メソッドをサポートしている場合、これは基礎となる ReadFrom を呼び出します。 バッファされたデータと基礎となる ReadFrom がある場合、これはバッファを埋めてから ReadFrom を呼び出します。
func (*Writer) Reset ¶ added in v1.2.0
Resetは、フラッシュされていないバッファデータを破棄し、エラーをクリアし、出力をwにリセットします。 Writer のゼロ値に対してResetを呼び出すと、内部バッファがデフォルトのサイズに初期化されます。 w.Reset(w)(つまり、Writer を自身にリセットすること)は何もしません。
func (*Writer) Write ¶
Write は p の内容をバッファに書き込みます。 書き込まれたバイト数を返します。 nn < len(p) の場合、短い書き込みの理由を説明するエラーも返ります。