0Pricing
Go Academy · Lekcja

Buforowane obiekty zapisujące

Wykonuj zapisy wsadowe

Buforowane obiekty zapisujące to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 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ć zapis

Podobnie jak w przypadku odczytu, każdy mały zapis może wywołać wywołanie systemowe. bufio.Writer gromadzi zapisy w pamięci i przesyła je dalej dużymi fragmentami.

Uwaga: buforowane dane zostaną utracone, jeśli nie wywołasz Flush().

Tworzenie bufio.Writer

Opakuj dowolny io.Writer. Tutaj opakowujemy os.Stdout.

package main

import (
	"bufio"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	w.WriteString("Hello buffered\n")
	w.Flush()
}

Nie zapomnij o Flush

Bez Flush() dane wyjściowe mogą nigdy się nie pojawić. Często stosowany idiom to defer w.Flush().

package main

import (
	"bufio"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()
	w.WriteString("written via defer\n")
}

Zapisywanie bajtów i stringów

Użyj Write dla slice’ów bajtów, WriteString dla stringów, a WriteByte i WriteRune dla pojedynczych wartości.

package main

import (
	"bufio"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	w.Write([]byte("bytes "))
	w.WriteString("string ")
	w.WriteRune('!')
	w.WriteByte('\n')
	w.Flush()
}

Sprawdzanie stanu bufora

Buffered() informuje, ile bajtów oczekuje w buforze, a Available() — ile wolnego miejsca pozostało.

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	w.WriteString("abc")
	fmt.Fprintf(os.Stderr, "buffered: %d\n", w.Buffered())
	w.Flush()
}

Automatyczne opróżnianie po zapełnieniu

Gdy bufor się zapełni, bufio.Writer automatycznie go opróżnia. Nadal musisz wywołać Flush() na końcu, aby zapisać pozostałą, niepełną zawartość bufora.

Niestandardowy rozmiar bufora

bufio.NewWriterSize(w, size) ustawia pojemność bufora. Większe bufory zmniejszają częstotliwość opróżniania.

package main

import (
	"bufio"
	"os"
)

func main() {
	w := bufio.NewWriterSize(os.Stdout, 8192)
	w.WriteString("custom size buffer\n")
	w.Flush()
}

Formatowany zapis za pomocą Fprintf

Ponieważ bufio.Writer jest obiektem io.Writer, możesz przekazać go do fmt.Fprintf, aby uzyskać formatowane i buforowane dane wyjściowe.

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	for i := 1; i <= 3; i++ {
		fmt.Fprintf(w, "line %d\n", i)
	}
	w.Flush()
}

Obsługa błędów zapisu

Błędy mogą ujawnić się dopiero przy późniejszym zapisie lub podczas wywołania Flush(). Zawsze sprawdzaj błąd zwracany przez Flush().

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	w.WriteString("data\n")
	if err := w.Flush(); err != nil {
		fmt.Fprintln(os.Stderr, "flush failed:", err)
	}
}

Grupowanie wielu zapisów

Największa korzyść polega na tym, że ciasna pętla wykonująca małe zapisy po buforowaniu powoduje tylko jedno lub kilka wywołań systemowych.

package main

import (
	"bufio"
	"os"
)

func main() {
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()
	for i := 0; i < 5; i++ {
		w.WriteString("x")
	}
	w.WriteByte('\n')
}

Najlepsze praktyki

  • Zawsze wywołuj Flush() (lub użyj defer)
  • Sprawdzaj błąd zwrócony przez Flush(), a nie tylko błędy poszczególnych zapisów
  • Dopasuj rozmiar bufora do charakterystyki obciążenia

Szybki test

Sprawdź swoją wiedzę na temat buforowanych writerów.

Podsumowanie

Dowiedziałeś się, jak grupować zapisy za pomocą bufio.Writer.

  • NewWriter / NewWriterSize
  • Write, WriteString, WriteByte, WriteRune
  • Współpracuje z fmt.Fprintf
  • Zawsze wywołuj Flush() i sprawdzaj zwracany przez nie błąd

Często zadawane pytania

Czy lekcja „Buforowane obiekty zapisujące” jest bezpłatna?

Tak — pełny tekst „Buforowane obiekty zapisują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 zapisujące”?

Wykonuj zapisy wsadowe Ć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 3 z 4.

Ile czasu zajmuje lekcja „Buforowane obiekty zapisują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