io.Reader
is treated like a stream. Because of this you cannot read it twice. Imagine an incoming TCP connection – you cannot rewind what’s coming in.
But you can use the io.TeeReader
to duplicate the stream:
package main
import (
"bytes"
"io"
"io/ioutil"
"log"
"strings"
)
func main() {
r := strings.NewReader("some io.Reader stream to be read\n")
var buf bytes.Buffer
tee := io.TeeReader(r, &buf)
log.Println(ioutil.ReadAll(tee))
log.Println(ioutil.ReadAll(&buf))
}
Example on Go Playground
Edit: As @mrclx pointed out: You need to read from the TeeReader
first, otherwise the buffer will be empty.