No meu projeto, tenho uma fatia de bytes da resposta de uma solicitação.
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
}
Isso funciona, mas se eu quero obter o corpo da resposta io.Reader
, como faço para converter? Eu tentei o newreader / escritor, mas não foi bem sucedido.
io.Reader
? Nesse caso, resp.Body já é desse tipo.[]byte
a umio.Reader
(e io.ReadSeeker)*bytes.Reader
que implementa aio.Reader
interface.Respostas:
Para obter um tipo implementado a
io.Reader
partir de uma[]byte
fatia, você pode usarbytes.NewReader
nobytes
pacote:Isso retornará um valor do tipo
bytes.Reader
que implementa a interfaceio.Reader
(eio.ReadSeeker
).Não se preocupe com o fato de eles não serem do mesmo tipo.
io.Reader
é uma interface e pode ser implementada por vários tipos diferentes. Para aprender um pouco mais sobre interfaces no Go, leia Go efetivo: interfaces e tipos .fonte
[]byte
em umio.Writer
? Por exemplobytes.NewWriter(destination)
bytes.Buffer
. Lá você criar um buffer que implementosio.Writer
assim:w := bytes.NewBuffer(destination)
.govet
:cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser
:(bytes.Reader
possui receptores de ponteiro e você está mudando de um tipo de ponteiro (*bytes.Reader
) para um tipo de base (bytes.Reader
). Apenas se livrar do asterisco (*
) e você deve estar bem :)Isso também funciona para se transformar
[]byte
emio.Reader
fonte