How to convert a byte slice to io.Reader in Golang

In this article we are going to see how you can convert a byte slice to a io.Reader in Go (Golang). A byte slice is just a “dynamic” array (slice) of bytes in Go, which for example can represent any data in memory, like file contents, data sent across the network, etc… It might be useful to convert a byte slice into an io.Reader because the io.Reader allows us to compose it with other parts of our program and the Go standard library as it implements the Read method.


byte slice to io.Reader

Let’s see an example on how we can convert a byte slice into an io.Reader in Go

package main

import (
  "bytes"
  "log"
)

func main() {
  data := []byte("this is some data stored as a byte slice in Go Lang!")
  
  // convert byte slice to io.Reader
  reader := bytes.NewReader(data)
  
  // read only 4 byte from our io.Reader
  buf := make([]byte, 4)
  n, err := reader.Read(buf)
  if err != nil {
    log.Fatal(err)
  }
  log.Println(string(buf[:n]))
}

The expected output is the following

2009/11/10 23:00:00 this

Try running this by yourself on the Go Playground https://play.golang.org/p/pzTj9J8aJyL

io.Reader to byte slice

Let’s see an example on how we can now convert a io.Reader into a byte slice in Go

package main

import (
  "bytes"
  "log"
  "strings"
)

func main() {
  ioReaderData := strings.NewReader("this is some data stored as a byte slice in Go Lang!")
  
  // creates a bytes.Buffer and read from io.Reader
  buf := &bytes.Buffer{}
  buf.ReadFrom(ioReaderData)
  
  // retrieve a byte slice from bytes.Buffer
  data := buf.Bytes()
  
  // only read the first 4 bytes
  log.Println(string(data[:4]))
}

The expected output is the following

2009/11/10 23:00:00 this

Try running this by yourself on the Go Playground https://play.golang.org/p/TPVm7Y7XIus


Ready for your next Go Job? Submit your profile and get hired on Golang Cafe