Mehrmals von einem einzelnen io.Reader lesen
In Go kann die Verwendung der io.ReadCloser-Schnittstelle zum Lesen von Daten aus einer Quelle ein Problem darstellen Herausforderung, wenn man versucht, es mehrmals zu lesen. Stellen Sie sich als Beispiel ein Szenario vor, in dem Sie request.Body (Typ io.ReadCloser), das ein Bild enthält, sowohl zum direkten Schreiben in eine Datei als auch zum Dekodieren verwenden möchten.
Problem:
Versuche, mehrere Instanzen des Readers zu erstellen, wie im folgenden Code, führen dazu, dass der zweite Aufruf eine Null zurückgibt Wert:
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)) }
Lösung:
Die io.Reader-Schnittstelle modelliert einen Stream, was bedeutet, dass er nicht zweimal gelesen werden kann. Um diese Einschränkung zu überwinden, können Sie die Funktion io.TeeReader verwenden, um einen doppelten Stream zu erstellen.
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)) }
Dieser Code zeigt, wie Sie mit io.TeeReader einen doppelten Stream aus r erstellen und den Inhalt in beide schreiben Abschlag und Buff. Indem Sie zuerst vom Tee lesen, können Sie sicherstellen, dass der Puffer mit dem Inhalt des Streams gefüllt ist.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go mehrmals von einem io.Reader lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!