How do I turn an io.Reader into a io.ReadCloser?

Viewed 26287

I have an io.Reader that doesn't require closing:

stringReader := strings.NewReader("shiny!")

And I want to pass it to a method that receives an io.ReadCloser

func readAndClose(source io.ReadCloser) {
    ...
}

How do I turn the io.Reader into a io.ReadCloser without specially creating a struct that implements the Close method?

1 Answers

If you're certain that your io.Reader doesn't require any actual closing, you can wrap it with an ioutil.NopCloser.

Go 1.16 Update

As of version 1.16 ioutil.NopCloser is deprecated.

NopCloser has been moved to io:

stringReader := strings.NewReader("shiny!")
stringReadCloser := io.NopCloser(stringReader)

Go 1.15 and older

From the godoc:

NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r.

So we can apply it like:

stringReader := strings.NewReader("shiny!")
stringReadCloser := ioutil.NopCloser(stringReader)
Related