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?
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 }
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.
If you're certain that your io.Reader doesn't require any actual closing, you can wrap it with an ioutil.NopCloser.
As of version 1.16 ioutil.NopCloser is deprecated.
NopCloser has been moved to io:
stringReader := strings.NewReader("shiny!") stringReadCloser := io.NopCloser(stringReader) 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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With