Тип bytes.Buffer
Тип bytes.Buffer является буфером байтов с изменяемым размером,
который предоставляет методы для чтения и записи данных.
Он часто используется для эффективного конкатенирования строк,
так как не создает новые объекты при каждой операции,
в отличие от оператора +. Буфер можно создать пустым
или инициализировать начальными данными с помощью функций
bytes.NewBuffer и bytes.NewBufferString.
Создание буфера
Создадим пустой буфер и буфер с начальными данными:
package 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())
}
Результат выполнения кода:
""
"hello"
"world"
Метод WriteString
Метод WriteString добавляет строку в конец буфера.
Он возвращает количество записанных байтов и возможную ошибку:
package 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())
}
Результат выполнения кода:
"Записано байт: 3, ошибка: <nil>"
"Go lang"
Метод Write
Метод Write добавляет в буфер срез байтов.
Этот метод полезен для работы с бинарными данными:
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
buffer.Write([]byte("abc"))
buffer.Write([]byte("123"))
fmt.Println(buffer.String())
}
Результат выполнения кода:
"abc123"
Метод String
Метод String преобразует содержимое буфера в строку.
Это удобно для финального получения результата накопления данных:
package 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)
}
Результат выполнения кода:
"aaaaa"
Метод Bytes
Метод Bytes возвращает срез байтов, содержащий
все данные буфера. Это полезно, если нужно работать с
байтами напрямую:
package 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)
}
Результат выполнения кода:
"[104 101 108 108 111]"
"hello"
Метод Read
Метод Read читает данные из буфера в переданный срез байтов.
Он возвращает количество прочитанных байтов и ошибку
io.EOF, когда буфер пуст:
package 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())
}
Результат выполнения кода:
"Прочитано байт: 2, ошибка: <nil>"
"data: ab"
"Остаток в буфере: cde"
Метод Reset
Метод Reset очищает буфер, удаляя все данные и обнуляя
внутреннее состояние. Это позволяет переиспользовать буфер:
package 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())
}
Результат выполнения кода:
"test"
"После Reset: "
"Новые данные: new data"
Смотрите также
-
функцию
bytes.NewBufferString,
которая создает буфер из строки -
метод
Buffer.WriteString,
который записывает строку в буфер -
метод
Buffer.Bytes,
который возвращает срез байтов буфера -
тип
strings.Builder,
аналогичный инструмент для эффективного построения строк