Maison >développement back-end >Golang >Comment lire plusieurs fois à partir d'un io.Reader ?

Comment lire plusieurs fois à partir d'un io.Reader ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-16 14:26:18394parcourir

How to Read from an io.Reader Multiple Times?

Comment lire à partir du même io.Reader plusieurs fois

Lorsque vous travaillez avec un io.Reader, tel que request.Body, qui contient des données comme une image, vous devrez peut-être accéder au contenu plusieurs fois. Cependant, l'utilisation de ioutil.ReadAll() consommerait l'intégralité du contenu, rendant les lectures ultérieures impossibles.

Le défi

Tenter de créer plusieurs instances du lecteur, comme indiqué dans le code ci-dessous, donne une valeur nulle pour le deuxième appel :

package main

import (
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    a := &r
    b := &r
    log.Println(ioutil.ReadAll(*a))
    log.Println(ioutil.ReadAll(*b))
}

La solution : TeeReader

Pour lire plusieurs fois à partir du même io.Reader, vous pouvez utiliser le io.TeeReader. Il duplique le flux, vous permettant de lire simultanément à partir de plusieurs sources.

package main

import (
    "bytes"
    "io"
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)

    log.Println(ioutil.ReadAll(tee))
    log.Println(ioutil.ReadAll(&buf))
}

Exemple :

Dans l'exemple ci-dessus, vous créez d'abord un TeeReader qui lit du lecteur d'origine et un tampon. Ensuite, vous lisez depuis le TeeReader et le tampon pour obtenir deux fois le même contenu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn