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
Libérer: 2024-12-18 19:36:11
original
946 Les gens l'ont consulté

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

}
Copier après la connexion

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)) 
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal