io.Pipe() создает связанную пару: *PipeReader и *PipeWriter. Запись блокируется, пока читающая сторона не прочитает данные.
pr, pw := io.Pipe()
go func() {
defer pw.Close()
io.Copy(pw, src)
}()
io.Copy(dst, pr)Типичный сценарий: связать API, ожидающие io.Reader и io.Writer, без загрузки всего потока в память.