0Pricing
Go Academy · Lekcja

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 / NewReaderSize opakowują io.Reader
  • ReadByte, ReadRune i ReadString odczytują dane z bufora
  • Peek pozwala 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

  1. Buforowane obiekty odczytujące
  2. Skanery
  3. Buforowane obiekty zapisujące
  4. Strumieniowe przetwarzanie dużych plików
← Powrót do Go Academy