Reading an io.Reader of unknown size into bytes array in golang

I have a file (say the descriptor is named file) opened via the os.Open() method so I want to read its contents into a bytes array.

I assume the approach would be to create the later

data := make([]byte, 10000000)

and then read the contents into it

n, err := file.Read(data)

My question is whether there is a more elegant/go-idiomatic way of going about this since by not knowing in advance the file size, I just pass a number I estimate would do (10000000) upon initialisation of the bytes array.


You can use the io/ioutil (up to Go 1.15) or os (Go 1.16 and higher) package. There is a helper function that reads an entire file into a byte slice.

// For Go 1.15 and lower:
package main

import "io/ioutil"

func main() {
    data, err := ioutil.ReadFile("path/to/my/file")
}
// For Go 1.16 and higher:
package main

import "os"

func main() {
    data, err := os.ReadFile("path/to/my/file")
}

In Go version 1.16 the io/ioutil function is still there for compatibility reasons but it was replicated in os. I assume that it will stay in io/ioutil for as long as Go has a version 1.xx because of the compatibility promise so you might keep using that one.

In case you have a file descriptor or any io.Reader you can use the io/ioutil package as well:

package main

import (
    "io/ioutil"
    "os"
)

func main() {
    f, _ := os.Open("path/to/my/file")
    data, err := ioutil.ReadAll(f)
}

The ioutil.ReadAll() is a wrapper for io.ReadAll() and it use predetermined size "512" bytes which enlarge as the read loops.

You can instead use the size from (*file.File).Stats().Size().

A more straightforward method would be using os.ReadFile() which automatically convert a file into []byte for you. It creates []byte with sizes from Stats().Size() method above before reading the file into byte.