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!