Converter fatia de bytes em io.

177

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.

Chan Willson
fonte
3
Se bem entendi, você quer a resposta como io.Reader? Nesse caso, resp.Body já é desse tipo.
Arjan #
3
golang.org/pkg/bytes/#NewReader irá "transformar" um []bytea um io.Reader(e io.ReadSeeker)
ANisus
@ Arjan yap ~ body ... eu quero obter a resposta como io.reader. Mas na classe base quando eu terminar a solicitação, a resposta foi eliminada .. basta salvar um corpo de resposta como [] byte no struct.
21715 Chan Chanson
@ ANisus eu vou tentar .... thx cara .. a propósito ... é parecido com tipo diferente .. #
31715 Chan
@ ChanWillson: Esse requisito faz mais sentido, o corpo não pode ser lido após fechá-lo. Como uso sugerido, *bytes.Readerque implementa a io.Readerinterface.
quer

Respostas:

304

Para obter um tipo implementado a io.Readerpartir de uma []bytefatia, você pode usar bytes.NewReaderno bytespacote:

r := bytes.NewReader(byteData)

Isso retornará um valor do tipo bytes.Readerque implementa a interface io.Reader(e io.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 .

ANisus
fonte
Existe uma função semelhante para transformar um []byteem um io.Writer? Por exemplobytes.NewWriter(destination)
byxor
4
@byxor Sim, o que você está procurando é bytes.Buffer. Lá você criar um buffer que implementos io.Writerassim: w := bytes.NewBuffer(destination).
ANisus
Eu não entendo esse erro de govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich 10/04/19
1
@VitalyZdanevich Isso ocorre porque bytes.Readerpossui 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 :)
ANisus
-18
r := strings(byteData)

Isso também funciona para se transformar []byteemio.Reader

cmslotes
fonte
4
Strings é um pacote, então estou assumindo que string (byteData) foi criada. Você pode obter uma string de uma fatia de bytes dessa maneira (menos os). String não implementa a interface io.Reader, pois não possui um método Read (). play.golang.org/p/eRMmtHsscd é um exemplo que falha quando Read () é chamado em uma string.
Jeffrey