Функция bufio.NewWriter

Функция bufio.NewWriter создает новый буферизированный писатель, который оборачивает переданный в качестве параметра интерфейс io.Writer. Буферизация позволяет накапливать данные в памяти и записывать их в целевой вывод крупными блоками, что значительно сокращает количество системных вызовов и повышает производительность при большом количестве операций записи.

Синтаксис

gobufio.NewWriter(w io.Writer) *bufio.Writer

Базовый пример

Давайте создадим буферизированный писатель для стандартного вывода и запишем в него строку:

gopackage main

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

func main() {
  writer := bufio.NewWriter(os.Stdout)
  writer.WriteString("Hello, World!")
  writer.Flush()
}

Результат выполнения кода:

go"Hello, World!"

Важно вызвать метод Flush, чтобы гарантировать запись всех буферизированных данных в целевой писатель. В противном случае данные могут быть потеряны.

Пример с файлом

Давайте запишем данные в файл с использованием буферизированного писателя:

gopackage main

import (
  "bufio"
  "os"
)

func main() {
  file, err := os.Create("output.txt")
  if err != nil {
    panic(err)
  }
  defer file.Close()

  writer := bufio.NewWriter(file)
  writer.WriteString("Line 1\n")
  writer.WriteString("Line 2\n")
  writer.WriteString("Line 3\n")
  writer.Flush()
}

После выполнения кода в файле output.txt будет содержаться три строки текста. Данные записываются в файл только после вызова метода Flush.

Пример с пользовательским писателем

Давайте создадим структуру, реализующую интерфейс io.Writer, и используем ее с буферизированным писателем:

gopackage main

import (
  "bufio"
  "fmt"
)

type CustomWriter struct {
  data []byte
}

func (cw *CustomWriter) Write(p []byte) (n int, err error) {
  cw.data = append(cw.data, p...)
  return len(p), nil
}

func main() {
  cw := &CustomWriter{}
  writer := bufio.NewWriter(cw)

  writer.WriteString("Hello")
  writer.WriteString(" ")
  writer.WriteString("World")
  writer.Flush()

  fmt.Println(string(cw.data))
}

Результат выполнения кода:

go"Hello World"

Буферизированный писатель собирает все данные в буфере и записывает их в пользовательский писатель единым блоком при вызове Flush.

Смотрите также

  • функцию bufio.NewWriterSize,
    которая создает буферизированный писатель с заданным размером буфера
  • метод Writer.Flush,
    который принудительно записывает данные из буфера
  • метод Writer.WriteString,
    который записывает строку в буферизированный писатель
  • функцию bufio.NewReader,
    которая создает буферизированный читатель