Golang io/ioutil NopCloser
Asked Answered
G

3

42

Does anyone have a good or any explanation of Golang's NopCloser function?
I looked around but failed to find anything besides Golang's main doc's explanation of:

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

Any pointers or explanation would be appreciated. Thanks.

Gyronny answered 26/1, 2015 at 21:22 Comment(0)
W
40

Whenever you need to return an io.ReadCloser, while making sure a Close() is available, you can use a NopCloser to build such a ReaderCloser.

You can see one example in this fork of gorest, in util.go

//Marshals the data in interface i into a byte slice, using the Marhaller/Unmarshaller specified in mime.
//The Marhaller/Unmarshaller must have been registered before using gorest.RegisterMarshaller
func InterfaceToBytes(i interface{}, mime string) (io.ReadCloser, error) {
    v := reflect.ValueOf(i)
    if v.Kind() == reflect.Ptr {
        v = v.Elem()
    }
    switch v.Kind() {
    case reflect.Bool:
        x := v.Bool()
        if x {
            return ioutil.NopCloser(bytes.NewBuffer([]byte("true"))), nil
        }
Whiten answered 26/1, 2015 at 21:31 Comment(0)
L
19

It's used for functions that require io.ReadCloser but your current object (for example a bytes.Buffer) doesn't provide a Close function.

Leslielesly answered 26/1, 2015 at 21:30 Comment(2)
ioutil.NopCloser only wraps io.Reader. You can create your own equivalent to produce an io.WriteCloserSolander
It also has uses where you want to be able to read from it multiple times, without losing the content, as in this example: medium.com/@xoen/…Odey
M
4

It is for when you need to supply an item that has a Close function, but when Close doesn't really make sense for that item. As such, the function pretty much does nothing:

func (nopCloser) Close() error { return nil }

https://github.com/golang/go/blob/go1.16.3/src/io/io.go#L620

Magistracy answered 7/4, 2021 at 0:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.