230
votes

In my project, I have a byte slice from a request's response.

defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode))
    return
}

respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
    return
}

This works, but if I want to get the response's body for io.Reader, how do I convert? I tried the newreader/writer but wasn't successful.

2
If I understand correctly you want the response as io.Reader? In that case resp.Body is already of that type.Arjan
golang.org/pkg/bytes/#NewReader will "turn" a []byte to an io.Reader (and io.ReadSeeker)ANisus
@Arjan yap~body...i want get the response as io.reader .but in the base class when i finish the request,the response have been killed.. just save a response body as []byte in struct.Chan Willson
@ANisus i will try....thx dude..by the way...it's look's like different type..Chan Willson
@ChanWillson: That requirement makes more sense, the body cannot be read after closing it. As suggested use *bytes.Reader which implements the io.Reader interface.Arjan

2 Answers

394
votes

To get a type that implements io.Reader from a []byte slice, you can use bytes.NewReader in the bytes package:

r := bytes.NewReader(byteData)

This will return a value of type bytes.Reader which implements the io.Reader (and io.ReadSeeker) interface.

Don't worry about them not being the same "type". io.Reader is an interface and can be implemented by many different types. To learn a little bit more about interfaces in Go, read Effective Go: Interfaces and Types.

-27
votes
r := strings(byteData)

This also works to turn []byte into io.Reader