Gepufferte Reader
Mit bufio effizient lesen
Gepufferte Reader ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum gepufferte Lesevorgänge
Wenn Sie ein Byte nach dem anderen aus einer Datei oder über ein Netzwerk lesen, wird jedes Mal ein Systemaufruf ausgelöst. Das ist langsam.
Das Paket bufio umschließt einen Reader und liest große Blöcke in einen Puffer im Arbeitsspeicher. Kleine Lesevorgänge werden aus diesem Puffer bedient.
- Weniger Systemaufrufe
- Deutlich schneller bei vielen kleinen Lesevorgängen
Einen bufio.Reader erstellen
Umschließen Sie jeden io.Reader mit bufio.NewReader. Hier umschließen wir einen strings.Reader.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("Hello, Go!"))
fmt.Printf("buffered reader ready: %T\n", r)
}Bytes lesen
ReadByte gibt das nächste einzelne Byte zurück. Es wird aus dem Puffer geliefert, nicht durch einen neuen Systemaufruf.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("Go"))
b1, _ := r.ReadByte()
b2, _ := r.ReadByte()
fmt.Printf("%c%c\n", b1, b2)
}Mit ReadString bis zu einem Trennzeichen lesen
ReadString(delim) liest bis zum ersten Auftreten des Trennzeichen-Bytes und gibt alles einschließlich des Trennzeichens zurück.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("first,second,third"))
part, _ := r.ReadString(',')
fmt.Printf("%q\n", part)
}Vorausschauendes Lesen
Peek(n) gibt die nächsten n Bytes zurück, ohne sie zu verbrauchen. Das ist ideal, um vor der eigentlichen Verarbeitung zu entscheiden, wie die Daten geparst werden sollen.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("HTTP/1.1"))
head, _ := r.Peek(4)
fmt.Printf("starts with: %s\n", head)
}Puffergröße
bufio.NewReaderSize(r, size) legt die Kapazität des Puffers fest. Ein größerer Puffer bedeutet weniger zugrunde liegende Lesevorgänge, benötigt aber mehr Speicher.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReaderSize(strings.NewReader("data"), 4096)
fmt.Println("buffer size:", r.Size())
}ReadLine im Vergleich zu ReadString
ReadString('\n') behält den Zeilenumbruch bei; viele Parser entfernen ihn lieber. Der Scanner (in der nächsten Lektion) erledigt das automatisch.
Verwenden Sie ReadString, wenn Sie vollständige Kontrolle über die Trennzeichen benötigen.
io.EOF behandeln
Wenn der zugrunde liegende Datenstrom erschöpft ist, geben die Lesemethoden io.EOF zurück. Prüfen Sie immer darauf, um zu erkennen, wann Sie aufhören müssen.
package main
import (
"bufio"
"fmt"
"io"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("ab"))
for {
c, err := r.ReadByte()
if err == io.EOF {
break
}
fmt.Printf("%c", c)
}
fmt.Println()
}Mit ReadRune Unicode lesen
ReadRune dekodiert eine vollständige UTF-8-Rune, die sich über mehrere Bytes erstrecken kann. Verwenden Sie es für Text mit Nicht-ASCII-Zeichen.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("héllo"))
for {
ru, _, err := r.ReadRune()
if err != nil {
break
}
fmt.Printf("%c ", ru)
}
fmt.Println()
}Bis zum Ende lesen
Ein häufig verwendetes Muster: Wiederholen Sie ReadString bis zu io.EOF, um einen Datenstrom Zeile für Zeile zu verarbeiten und dabei die genaue Kontrolle zu behalten.
package main
import (
"bufio"
"fmt"
"io"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("a\nb\nc\n"))
for {
line, err := r.ReadString('\n')
fmt.Print("got: " + line)
if err == io.EOF {
break
}
}
}Wann Sie bufio.Reader verwenden sollten
- Zum Umschließen langsamer Quellen (Dateien, Sockets)
- Bei vielen kleinen Lesevorgängen
- Wenn Sie vorausschauen oder nach Trennzeichen beziehungsweise Runen lesen müssen
Für einfaches zeilenweises Lesen sollten Sie bufio.Scanner verwenden (nächste Lektion).
Kurze Überprüfung
Testen Sie Ihr Verständnis gepufferter Reader.
Zusammenfassung
Sie haben gelernt, wie bufio.Reader durch Puffern die Anzahl der Systemaufrufe reduziert.
NewReader/NewReaderSizeumschließen einen io.ReaderReadByte,ReadRuneundReadStringliefern Daten aus dem PufferPeekliest voraus, ohne Daten zu verbrauchen- Bei
io.EOFaufhören
Häufig gestellte Fragen
Ist die Lektion „Gepufferte Reader“ kostenlos?
Ja — der vollständige Text von „Gepufferte Reader“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Gepufferte Reader“?
Mit bufio effizient lesen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Gepufferte Reader“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Gepufferte Reader
- Scanner
- Gepufferte Writer
- Große Dateien streamen