четверг, 16 июля 2020 г.

Пакет io в Golang, функция Pipe

func Pipe() (*PipeReader, *PipeWriter)

Pipe создает синхронный pipe в памяти. Его можно использовать для соединения кода, ожидающего io.Reader, с кодом, ожидающим io.Writer.

Чтения и записи в pipe сопоставляются один к одному, за исключением случаев, когда для чтения одной записи требуется несколько операций чтения. То есть каждый Write в PipeWriter блокируется до тех пор, пока не будет выполнено одна или несколько операций Read из PipeReader, которые полностью используют записанные данные. Данные копируются непосредственно из Write в соответствующие Read (или несколько Read); нет внутренней буферизации.

Безопасно вызывать Read и Write параллельно друг с другом или с помощью Close. Параллельные вызовы на чтение и параллельные вызовы на запись также безопасны: индивидуальные вызовы будут проходить последовательно.

package main

import (
    "bytes"
    "fmt"
    "io"
)

func main() {
    r, w := io.Pipe()

    go func() {
        fmt.Fprint(w, "some text to be read\n")
        w.Close()
    }()

    buf := new(bytes.Buffer)
    buf.ReadFrom(r)
    fmt.Print(buf.String())

}

Вывод:

some text to be read

Тип PipeReader

PipeReader - это считывающая половина pipe.

type PipeReader struct {
    // содержит отфильтрованные или неэкспортированные поля
}

func (r *PipeReader) Close() error

Close закрывает reader; последующие записи в записывающей половине pipe будут возвращать ошибку ErrClosedPipe.

func (r *PipeReader) CloseWithError(err error) error

CloseWithError закрывает reader; последующие записи в записывающей половине pipe будут возвращать err.

CloseWithError никогда не перезаписывает предыдущую ошибку, если она существует, и всегда возвращает nil.

func (r *PipeReader) Read(data []byte) (n int, err error)

Read реализует стандартный интерфейс Read: он читает данные из pipe, блокируя до тех пор, пока не прибудет writer или не закроется конец записи. Если конец записи закрыт с ошибкой, эта ошибка возвращается как err; в противном случае ошибка EOF.

Тип PipeWriter

PipeWriter - это записывающая половина pipe.

type PipeWriter struct {
    // содержит отфильтрованные или неэкспортированные поля
}

func (w *PipeWriter) Close() error

Close закрывает writer; последующие чтения из считывающей половины pipe не будут возвращать байты и вернут EOF.

func (w *PipeWriter) CloseWithError(err error) error

CloseWithError закрывает writer; последующие операции чтения из считывающей половины pipe не будут возвращать байтов и вернут ошибку err, или EOF, если err равно nil.

CloseWithError никогда не перезаписывает предыдущую ошибку, если она существует, и всегда возвращает nil.

func (w *PipeWriter) Write(data []byte) (n int, err error)

Write реализует стандартный интерфейс Write: он записывает данные в pipe, блокируя до тех пор, пока один или несколько считывателей не израсходуют все данные или не будет закрыт конец чтения. Если конец чтения закрыт с ошибкой, эта err возвращается как err; в противном случае ошибка - ErrClosedPipe.


Читайте также:


Комментариев нет:

Отправить комментарий