Давайте вычитаем контент используя 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 }