Heim > Backend-Entwicklung > Golang > Wie kann ich in Go mehrmals von einem io.Reader lesen?

Wie kann ich in Go mehrmals von einem io.Reader lesen?

Patricia Arquette
Freigeben: 2024-12-18 19:36:11
Original
928 Leute haben es durchsucht

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

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

}
Nach dem Login kopieren

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)) 
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage