Convierta el segmento de bytes a io.

177

En mi proyecto, tengo un segmento de bytes de la respuesta de una solicitud.

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
}

Esto funciona, pero si quiero obtener el cuerpo de la respuesta io.Reader, ¿cómo puedo convertir? Probé con el lector / escritor nuevo pero no tuve éxito.

Chan Willson
fuente
3
Si entiendo correctamente, ¿quieres la respuesta como io.Reader? En ese caso, resp.Body ya es de ese tipo.
Arjan
3
golang.org/pkg/bytes/#NewReader "convertirá" []bytea en an io.Reader(y io.ReadSeeker)
ANisus el
@Arjan yap ~ body ... quiero obtener la respuesta como io.reader. Pero en la clase base cuando termino la solicitud, la respuesta ha sido eliminada ... solo guarde un cuerpo de respuesta como [] byte en struct.
Chan Willson el
@ ANisus lo intentaré ... gracias amigo ... por cierto ... parece un tipo diferente ...
Chan Willson el
@ChanWillson: Ese requisito tiene más sentido, el cuerpo no se puede leer después de cerrarlo. Como uso sugerido *bytes.Readerque implementa la io.Readerinterfaz.
Arjan

Respuestas:

304

Para obtener un tipo que se implemente io.Readerdesde un []bytesegmento, puede usarlo bytes.NewReaderen el bytespaquete:

r := bytes.NewReader(byteData)

Esto devolverá un valor de tipo bytes.Readerque implementa la interfaz io.Reader(y io.ReadSeeker).

No se preocupe por que no sean del mismo "tipo". io.Readeres una interfaz y se puede implementar de muchos tipos diferentes. Para aprender un poco más sobre las interfaces en Go, lea Go eficaz: interfaces y tipos .

ANisus
fuente
¿Hay una función similar para convertir un []byteen un io.Writer? Por ejemplobytes.NewWriter(destination)
byxor el
44
@byxor Sí, lo que estás buscando es bytes.Buffer. Hay que crear un búfer que implementa io.Writercomo esto: w := bytes.NewBuffer(destination).
ANisus
No entiendo este error de govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich
1
@VitalyZdanevich Eso se debe a que bytes.Readertiene receptores de puntero y lo está convirtiendo de un tipo de puntero ( *bytes.Reader) a un tipo base ( bytes.Reader). Simplemente elimine el asterisco ( *) y debería estar bien :)
ANisus
-18
r := strings(byteData)

Esto también funciona para convertirse []byteenio.Reader

cmslotes
fuente
44
Strings es un paquete, por lo que supongo que se quería decir string (byteData). Puede obtener una cadena de un segmento de bytes de esa manera (menos la s). String no implementa la interfaz io.Reader ya que no tiene un método Read (). play.golang.org/p/eRMmtHsscd es un ejemplo que falla cuando se llama a Read () en una cadena.
jeffrey