Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

go

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?

like image 936
noamt Avatar asked Aug 29 '18 11:08

noamt


People also ask

What is io readcloser?

It's for an explicit definition of Reader and Closer interface. So let's say you write some functionality that reads data, but you also want to close resource after doing it (again not to leak descriptors). func ...( r io.ReaderCloser) { defer r.Close() ... // some reading }

What is io package in GoLang?

The io package in Go provides input-output primitives as well as interfaces to them. It is one of the most essential packages in all of GoLang.


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) 
like image 175
noamt Avatar answered Sep 29 '22 08:09

noamt