👣 Использование io.Pipe в Golang



▶️Вот пример использования io.Pipe для создания туннеля между писателем и читателем.

// отправляем пользователю ответ с аттачем

//reader, writer := io.Pipe()

writer := new(bytes.Buffer)

err = main.Doc.Save(writer) // метод Документа из unioffice - принимает io.Writer, сохраняет тип Document в zip.

//writer.Close() // для Pipe

...

reader := bytes.NewReader(writer.Bytes())

...

nbytes, err := io.Copy(w, reader) // w это http.ResponseWriter


При запуске эта программа зависает, поэтому приходится использовать промежуточный буфер, как видно из кода. Что здесь не так с использованием Pipe?





▶️Проблема здесь довольно проста, вы же заметили?

Нужно просто вызов Writer обернуть в горутину, иначе все блокируется.

go func () {

defer writer.Close()

err = main.Doc.Save(writer) // принимает io.Writer

...

}

}()


Вот и всё



@golang_interview