Давайте вычитаем контент используя golang функцию ioutil.ReadAll из io.ReadWriter таким образом, чтобы контент остался в буфере.

Давайте предположим, что мы создаем буфер таким образом:
out := new(bytes.Buffer)
Затем в каком-то коде наполняем буфер, используя метод Write() из Writer interface. Например, вот, так:
out.Write([]byte("String to write\n"))
out.Write([]byte("Another string to buffer\n"))
Затем нужно все содержимое буфера вычитать чтобы записать в файл. При этом, в out буфере должен остаться сам контент.
import (
"io"
"io/ioutil"
)
func dirTree(out io.ReadWriter, dirName string) error {
//let's imagine here we write to io.ReadWriter!
//out.Write([]byte("Just string to write \n"))
//read from buffer
readBuf, _ := ioutil.ReadAll(out)
//write content to file! But actually we lose content from "out" variable in previous line
ioutil.WriteFile("dirTestName", readBuf, 0777)
return nil
}
В этой строке readBuf, _ := ioutil.ReadAll(out) мы прочитали все содержимое буфера. В следующей строке содержимое записали в файл.
Теперь буфер пуст. Это работает как кувшин: если вычитали через ReadAll - второй раз вычитать то же самое не можем, так как кувшин пуст.
Что мы можем сделать: отправить контент назад в буфер:
out.Write(readBuf)
В конце выполнения функции dirTree контент в буфере, мы добились того, чего хотели. С маленькой оговоркой, что буфер был пуст мгновение пока записывался файл.
import (
"io"
"io/ioutil"
)
func dirTree(out io.ReadWriter, dirName string) error {
//let's imagine here we write to io.ReadWriter!
//out.Write([]byte("Just string to write \n"))
//read from buffer
readBuf, _ := ioutil.ReadAll(out)
//write content to file! But actually we lose content from "out" variable in previous line
ioutil.WriteFile("dirTestName", readBuf, 0777)
//write the same content again!
out.Write(readBuf)
return nil
}