Buforowane obiekty odczytujące
Wydajnie odczytuj za pomocą bufio
Buforowane obiekty odczytujące to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Dlaczego buforować odczyt
Odczytanie jednego bajtu z pliku lub sieci za każdym razem wywołuje wywołanie systemowe przy każdym odczycie. To jest wolne.
Pakiet bufio opakowuje reader i odczytuje duże fragmenty do bufora w pamięci, obsługując małe odczyty z tego bufora.
- Mniej wywołań systemowych
- Znacznie większa szybkość przy wielu małych odczytach
Tworzenie bufio.Reader
Dowolny io.Reader można opakować za pomocą bufio.NewReader. Tutaj opakowujemy 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)
}Odczytywanie bajtów
ReadByte zwraca następny pojedynczy bajt. Jest on pobierany z bufora, a nie w wyniku nowego wywołania systemowego.
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)
}ReadString do ogranicznika
ReadString(delim) odczytuje dane do pierwszego wystąpienia bajtu ogranicznika, zwracając wszystko łącznie z ogranicznikiem.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("first,second,third"))
part, _ := r.ReadString(',')
fmt.Printf("%q\n", part)
}Podgląd kolejnych danych
Peek(n) zwraca następne n bajtów, nie zużywając ich. To świetne rozwiązanie, gdy trzeba zdecydować, jak analizować dane, zanim podejmie się ostateczną decyzję.
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)
}Rozmiar bufora
bufio.NewReaderSize(r, size) ustawia pojemność bufora. Większy bufor oznacza mniej odczytów z bazowego źródła, ale większe zużycie pamięci.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReaderSize(strings.NewReader("data"), 4096)
fmt.Println("buffer size:", r.Size())
}ReadLine a ReadString
ReadString('\n') zachowuje znak nowej linii, choć wiele parserów woli go usuwać. Scanner z następnej lekcji robi to automatycznie.
Użyj ReadString, gdy potrzebujesz pełnej kontroli nad ogranicznikami.
Obsługa io.EOF
Gdy bazowy strumień zostanie wyczerpany, metody odczytu zwracają io.EOF. Zawsze sprawdzaj tę wartość, aby wiedzieć, kiedy zakończyć odczyt.
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()
}ReadRune dla Unicode
ReadRune dekoduje pełną runę UTF-8, która może zajmować wiele bajtów. Używaj go do tekstu zawierającego znaki spoza ASCII.
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()
}Odczyt do końca
Typowy wzorzec to pętla z użyciem ReadString aż do napotkania EOF, aby przetwarzać strumień wiersz po wierszu, zachowując pełną kontrolę.
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
}
}
}Kiedy używać bufio.Reader
- Do opakowywania wolnych źródeł, takich jak pliki i gniazda
- Przy wielu małych odczytach
- Gdy trzeba podejrzeć dane lub odczytywać je według ogranicznika albo runy
Do prostego skanowania wierszy użyj bufio.Scanner z następnej lekcji.
Szybki test
Sprawdź swoją wiedzę na temat buforowanych readerów.
Podsumowanie
Dowiedziałeś się, jak bufio.Reader ogranicza liczbę wywołań systemowych dzięki buforowaniu.
NewReader/NewReaderSizeopakowują io.ReaderReadByte,ReadRuneiReadStringodczytują dane z buforaPeekpozwala zajrzeć do kolejnych danych bez ich zużywania- Odczyt należy zakończyć po
io.EOF
Często zadawane pytania
Czy lekcja „Buforowane obiekty odczytujące” jest bezpłatna?
Tak — pełny tekst „Buforowane obiekty odczytujące” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Buforowane obiekty odczytujące”?
Wydajnie odczytuj za pomocą bufio Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Buforowane obiekty odczytujące”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Buforowane obiekty odczytujące
- Skanery
- Buforowane obiekty zapisujące
- Strumieniowe przetwarzanie dużych plików