Convert an io.ReadCloser to String (original) (raw)
Written byEdd Turtle on gophercoding.com
on 1st of October 2022
(Updated: 2nd of April 2023)
Using Go, we often make HTTP calls these days using net/http, which result in a response of type io.ReadCloser… which are hard to read for the layman (like me). What we really want to the response in the form of a string which we can read. This post will talk about how to convert these ReadCloser into strings.
First we’ll look at the problem, then we have two different solutions.
Problem:
Because ReadCloser is a struct object, we can’t print it out using fmt/log.
| 1 2 3 4 5 6 7 8 9 10 11 | package main import ( "fmt" "net/http" ) func main() { response, _ := http.Get("https://gophercoding.com/site.webmanifest") fmt.Println(response.Body) } |
|---|
| 1 2 | $ go run ioread.go &{[] {0xc000096300} <nil> <nil>} |
|---|
Solution 1: Buffer
Write the contents of the ReadCloser to an in-memory buffer.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "fmt" "net/http" "bytes" ) func main() { response, _ := http.Get("https://gophercoding.com/site.webmanifest") buf := new(bytes.Buffer) buf.ReadFrom(response.Body) respBytes := buf.String() respString := string(respBytes) fmt.Printf(respString) } |
|---|
Solution 2: Ioutil
Use the helper package ioutil to read all the contents into a []byte array for us.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "net/http" "io/ioutil" ) func main() { response, _ := http.Get("https://gophercoding.com/site.webmanifest") respBytes, err := ioutil.ReadAll(response.Body) if err != nil { panic(err) } respString := string(respBytes) fmt.Printf(respString) } |
|---|


Edd is a PHP and Go developer who enjoys blogging about his experiences, mostly about creating and coding new things he's working on and is a big beliver in open-source and Linux.