Буферизованные средства записи
Выполняйте пакетную запись
«Буферизованные средства записи» — бесплатный урок 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/NewWriterSizeWrite,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 — локальная установка не требуется.
Все уроки этого курса
- Буферизованные средства чтения
- Сканеры
- Буферизованные средства записи
- Потоковая обработка больших файлов