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.
io.Reader
? En ese caso, resp.Body ya es de ese tipo.[]byte
a en anio.Reader
(y io.ReadSeeker)*bytes.Reader
que implementa laio.Reader
interfaz.Respuestas:
Para obtener un tipo que se implemente
io.Reader
desde un[]byte
segmento, puede usarlobytes.NewReader
en elbytes
paquete:Esto devolverá un valor de tipo
bytes.Reader
que implementa la interfazio.Reader
(yio.ReadSeeker
).No se preocupe por que no sean del mismo "tipo".
io.Reader
es 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 .fuente
[]byte
en unio.Writer
? Por ejemplobytes.NewWriter(destination)
bytes.Buffer
. Hay que crear un búfer que implementaio.Writer
como esto: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
tiene 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 :)Esto también funciona para convertirse
[]byte
enio.Reader
fuente