ChatGPT解决这个技术问题 Extra ChatGPT

Convert byte slice to io.Reader

go

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.

If I understand correctly you want the response as io.Reader? In that case resp.Body is already of that type.
golang.org/pkg/bytes/#NewReader will "turn" a []byte to an io.Reader (and io.ReadSeeker)
@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.
@ANisus i will try....thx dude..by the way...it's look's like different type..
@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.

P
Pang

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.


Is there a similar function to turn a []byte into an io.Writer? E.g. bytes.NewWriter(destination)
@byxor Yes, what you are looking for is bytes.Buffer. There you create a buffer that implements io.Writer like this: w := bytes.NewBuffer(destination).
I do not understand this error from govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser :(
@VitalyZdanevich That is because bytes.Reader has pointer receivers, and you are turning it from a pointer type (*bytes.Reader) to a base type (bytes.Reader) . Just get rid of the asterisk (*) and you should be fine :)