Convertir la tranche d'octet en io.Reader

178

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.

Chan Willson
la source
3
Si je comprends bien, vous voulez la réponse comme io.Reader? Dans ce cas, resp.Body est déjà de ce type.
Arjan
3
golang.org/pkg/bytes/#NewReader "transformera" a []byteen io.Reader(et io.ReadSeeker)
ANisus
@Arjan yap ~ body ... je veux obtenir la réponse en tant que io.reader. Mais dans la classe de base lorsque je termine la requête, la réponse a été tuée .. il suffit de sauvegarder un corps de réponse sous [] octet dans struct.
Chan Willson
@ANisus je vais essayer .... merci mec.. au fait ... ça ressemble à un type différent ..
Chan Willson
@ChanWillson: Cette exigence a plus de sens, le corps ne peut pas être lu après sa fermeture. Comme utilisation suggérée *bytes.Readerqui implémente l' io.Readerinterface.
Arjan

Réponses:

307

Pour obtenir un type qui implémente à io.Readerpartir d'une []bytetranche, vous pouvez utiliser bytes.NewReaderdans le bytespackage:

r := bytes.NewReader(byteData)

Cela retournera une valeur de type bytes.Readerqui implémente l' interface io.Reader(et io.ReadSeeker).

Ne vous inquiétez pas qu'ils ne soient pas du même «type». io.Readerest 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 .

ANisus
la source
Existe-t-il une fonction similaire pour transformer un []byteen un io.Writer? Par exemplebytes.NewWriter(destination)
byxor
4
@byxor Oui, ce que vous recherchez, c'est bytes.Buffer. Il vous créez un tampon qui implémente io.Writercomme ceci: w := bytes.NewBuffer(destination).
ANisus
Je ne comprends pas cette erreur de govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser(
Vitaly Zdanevich
1
@VitalyZdanevich C'est parce qu'il bytes.Readera 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 :)
ANisus
-19
r := strings(byteData)

Cela fonctionne également pour se transformer []byteenio.Reader

cmslotes
la source
4
Strings est un package, donc je suppose que string (byteData) était destiné. Vous pouvez obtenir une chaîne à partir d'une tranche d'octets de cette manière (moins les s). String n'implémente pas l'interface io.Reader car il n'a pas de méthode Read (). play.golang.org/p/eRMmtHsscd est un exemple qui échoue lorsque Read () est appelé sur une chaîne.
jeffrey