Тип bytes.Buffer

Тип bytes.Buffer является буфером байтов с изменяемым размером, который предоставляет методы для чтения и записи данных. Он часто используется для эффективного конкатенирования строк, так как не создает новые объекты при каждой операции, в отличие от оператора +. Буфер можно создать пустым или инициализировать начальными данными с помощью функций bytes.NewBuffer и bytes.NewBufferString.

Создание буфера

Создадим пустой буфер и буфер с начальными данными:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  // Пустой буфер
  var buffer1 bytes.Buffer

  // Буфер с начальными данными из строки
  buffer2 := bytes.NewBufferString("hello")

  // Буфер с начальными данными из среза байтов
  initialData := []byte("world")
  buffer3 := bytes.NewBuffer(initialData)

  fmt.Println(buffer1.String())
  fmt.Println(buffer2.String())
  fmt.Println(buffer3.String())
}

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

go""
"hello"
"world"

Метод WriteString

Метод WriteString добавляет строку в конец буфера. Он возвращает количество записанных байтов и возможную ошибку:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  var buffer bytes.Buffer
  n, err := buffer.WriteString("Go ")
  buffer.WriteString("lang")
  fmt.Printf("Записано байт: %d, ошибка: %v\n", n, err)
  fmt.Println(buffer.String())
}

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

go"Записано байт: 3, ошибка: <nil>"
"Go lang"

Метод Write

Метод Write добавляет в буфер срез байтов. Этот метод полезен для работы с бинарными данными:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  var buffer bytes.Buffer
  buffer.Write([]byte("abc"))
  buffer.Write([]byte("123"))
  fmt.Println(buffer.String())
}

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

go"abc123"

Метод String

Метод String преобразует содержимое буфера в строку. Это удобно для финального получения результата накопления данных:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  var buffer bytes.Buffer
  for i := 0; i < 5; i++ {
    buffer.WriteString("a")
  }
  result := buffer.String()
  fmt.Println(result)
}

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

go"aaaaa"

Метод Bytes

Метод Bytes возвращает срез байтов, содержащий все данные буфера. Это полезно, если нужно работать с байтами напрямую:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  var buffer bytes.Buffer
  buffer.WriteString("hello")
  b := buffer.Bytes()
  fmt.Printf("%v\n", b)
  fmt.Printf("%s\n", b)
}

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

go"[104 101 108 108 111]"
"hello"

Метод Read

Метод Read читает данные из буфера в переданный срез байтов. Он возвращает количество прочитанных байтов и ошибку io.EOF, когда буфер пуст:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  buffer := bytes.NewBufferString("abcde")
  data := make([]byte, 2)

  n, err := buffer.Read(data)
  fmt.Printf("Прочитано байт: %d, ошибка: %v\n", n, err)
  fmt.Printf("data: %s\n", data)
  fmt.Printf("Остаток в буфере: %s\n", buffer.String())
}

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

go"Прочитано байт: 2, ошибка: <nil>"
"data: ab"
"Остаток в буфере: cde"

Метод Reset

Метод Reset очищает буфер, удаляя все данные и обнуляя внутреннее состояние. Это позволяет переиспользовать буфер:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  var buffer bytes.Buffer
  buffer.WriteString("test")
  fmt.Println(buffer.String())

  buffer.Reset()
  fmt.Println("После Reset:", buffer.String())

  buffer.WriteString("new data")
  fmt.Println("Новые данные:", buffer.String())
}

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

go"test"
"После Reset: "
"Новые данные: new data"

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

  • функцию bytes.NewBufferString,
    которая создает буфер из строки
  • метод Buffer.WriteString,
    который записывает строку в буфер
  • метод Buffer.Bytes,
    который возвращает срез байтов буфера
  • тип strings.Builder,
    аналогичный инструмент для эффективного построения строк