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żyjdefer) - 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/NewWriterSizeWrite,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
- Buforowane obiekty odczytujące
- Skanery
- Buforowane obiekty zapisujące
- Strumieniowe przetwarzanie dużych plików