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!