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

Comment puis-je lire plusieurs fois à partir d'un io.Reader en Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 19:36:11961parcourir

How Can I Read from an io.Reader Multiple Times in Go?

Lire plusieurs fois à partir d'un seul io.Reader

Dans Go, l'utilisation de l'interface io.ReadCloser pour lire des données à partir d'une source peut présenter un défi lorsque vous essayez de le lire plusieurs fois. À titre d'exemple, considérons un scénario dans lequel vous souhaitez utiliser request.Body (type io.ReadCloser), qui contient une image, à la fois pour écrire directement dans un fichier et pour décoder.

Problème :

Les tentatives de création de plusieurs instances du lecteur, comme dans le code suivant, entraînent le deuxième appel renvoyant un zéro value :

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))

}

Solution :

L'interface io.Reader modélise un flux, ce qui signifie qu'il ne peut pas être lu deux fois. Pour surmonter cette limitation, vous pouvez utiliser la fonction io.TeeReader pour créer un flux en double.

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)) 
}

Ce code montre comment utiliser io.TeeReader pour créer un flux en double à partir de r et écrire le contenu dans les deux tee-shirt et buf. En lisant d'abord depuis tee, vous pouvez vous assurer que le tampon est rempli avec le contenu du flux.

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