Dans mon projet, j'ai une tranche d'octet de la réponse d'une requête.
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
}
Cela fonctionne, mais si je veux obtenir le corps de la réponse io.Reader
, comment puis-je convertir? J'ai essayé le nouveau lecteur / écrivain mais je n'ai pas réussi.
io.Reader
? Dans ce cas, resp.Body est déjà de ce type.[]byte
enio.Reader
(et io.ReadSeeker)*bytes.Reader
qui implémente l'io.Reader
interface.Réponses:
Pour obtenir un type qui implémente à
io.Reader
partir d'une[]byte
tranche, vous pouvez utiliserbytes.NewReader
dans lebytes
package:Cela retournera une valeur de type
bytes.Reader
qui implémente l' interfaceio.Reader
(etio.ReadSeeker
).Ne vous inquiétez pas qu'ils ne soient pas du même «type».
io.Reader
est une interface et peut être implémentée par de nombreux types différents. Pour en savoir un peu plus sur les interfaces dans Go, lisez Effective Go: Interfaces et types .la source
[]byte
en unio.Writer
? Par exemplebytes.NewWriter(destination)
bytes.Buffer
. Il vous créez un tampon qui implémenteio.Writer
comme ceci: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
a des récepteurs de pointeur et que vous le transformez d'un type pointeur (*bytes.Reader
) en un type de base (bytes.Reader
). Débarrassez-vous simplement de l'astérisque (*
) et tout devrait aller bien :)Cela fonctionne également pour se transformer
[]byte
enio.Reader
la source