Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read multiple times from same io.Reader

Tags:

go

reader

I want to use request.Body(type io.ReadCloser) which is containing a image.

I dont want to use ioutil.ReadAll() as i want to write this body directly to the file as well as want to decode it, so i only want to use the reference to the content to pass to further function calls,

I tried creating multiple instances of reader for example shown below

package main  import (     "io/ioutil"     "log"     "strings" )   func main() {     r := strings.NewReader("some io.Reader stream to be read\n")     a := &r     b := &r     log.Println(ioutil.ReadAll(*a))     log.Println(ioutil.ReadAll(*b))  } 

but in second call it always results into nil.

Please help me how can i pass multiple separate reference for the same reader?

like image 570
Abhishek Soni Avatar asked Sep 30 '16 11:09

Abhishek Soni


People also ask

How do I reset IO reader?

Press the reset button on the back for 30 seconds to reset the Touch io reader.

What is io writer?

The io.Writer interface is used by many packages in the Go standard library and it represents the ability to write a byte slice into a stream of data. More generically allows you to write data into something that implements the io.Writer interface.


1 Answers

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.

like image 122
TheHippo Avatar answered Sep 19 '22 13:09

TheHippo