0Pricing
Go Academy · Урок

Буферизованные средства записи

Выполняйте пакетную запись

«Буферизованные средства записи» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Зачем нужны буферизованные записи

Как и небольшая операция чтения, каждая небольшая запись может вызвать системный вызов. bufio.Writer накапливает записи в памяти и сбрасывает их большими блоками.

Важно: буферизованные данные будут потеряны, если не вызвать Flush().

Создание bufio.Writer

Оберните любой объект записи io.Writer. Здесь мы оборачиваем os.Stdout.

package main

import (
	"bufio"
	"os"
)

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

Не забудьте вызвать Flush

Без Flush() Ваши выходные данные могут никогда не появиться. Распространённый идиоматичный вариант — defer w.Flush().

package main

import (
	"bufio"
	"os"
)

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

Запись Bytes и строк

Используйте Write для срезов байтов, WriteString для строк, а WriteByte и WriteRune — для отдельных значений.

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()
}

Проверка состояния буфера

Buffered() сообщает, сколько байт ожидает записи, а Available() — сколько свободного места осталось.

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()
}

Автоматический Flush при заполнении

Когда буфер заполняется, bufio.Writer автоматически выполняет сброс. Тем не менее в конце необходимо вызвать Flush(), чтобы обработать оставшуюся неполную часть буфера.

Пользовательский размер буфера

bufio.NewWriterSize(w, size) задаёт ёмкость. Большие буферы уменьшают частоту сброса.

package main

import (
	"bufio"
	"os"
)

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

Форматированные записи с Fprintf

Поскольку bufio.Writer является io.Writer, его можно передать в fmt.Fprintf для форматированного буферизованного вывода.

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()
}

Обработка ошибок записи

Ошибки могут проявиться при следующей записи или во время вызова Flush(). Всегда проверяйте ошибку, возвращённую 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)
	}
}

Объединение множества записей

Главное преимущество: тесный цикл небольших записей после буферизации превращается в один или несколько системных вызовов.

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')
}

Лучшие практики

  • Всегда вызывайте Flush() (или используйте defer)
  • Проверяйте ошибку, возвращённую Flush(), а не только ошибки отдельных записей
  • Подбирайте размер буфера под рабочую нагрузку

Быстрая проверка

Проверьте свои знания о буферизованных средствах записи.

Итоги

Вы научились объединять записи с помощью bufio.Writer.

  • NewWriter / NewWriterSize
  • Write, WriteString, WriteByte, WriteRune
  • Работает с fmt.Fprintf
  • Всегда вызывайте Flush() и проверяйте его ошибку

Часто задаваемые вопросы

Урок «Буферизованные средства записи» бесплатный?

Да — полный текст урока «Буферизованные средства записи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Буферизованные средства записи»?

Выполняйте пакетную запись Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Буферизованные средства записи»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Буферизованные средства чтения
  2. Сканеры
  3. Буферизованные средства записи
  4. Потоковая обработка больших файлов
← Назад к Go Academy