Интерфейс io.ByteWriter
Интерфейс io.ByteWriter определяет контракт для записи одного байта в некоторый поток данных.
Он содержит единственный метод WriteByte, который принимает байт (тип byte) и возвращает ошибку,
если запись не удалась. Этот интерфейс часто используется для низкоуровневой записи данных,
например, при работе с файлами, сетевыми соединениями или буферами.
Метод WriteByte позволяет записывать данные по одному байту, что может быть полезно
при построении бинарных протоколов или сериализации.
Синтаксис
type ByteWriter interface {
WriteByte(c byte) error
}
Метод WriteByte принимает один аргумент — байт для записи.
Возвращает ошибку, если запись завершилась неудачей.
Пример
Создадим буфер и запишем в него отдельные байты с использованием io.ByteWriter.
Стандартный тип bytes.Buffer реализует этот интерфейс:
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
var buf bytes.Buffer
var bw io.ByteWriter = &buf
err := bw.WriteByte('A')
if err != nil {
fmt.Println("Error:", err)
return
}
err = bw.WriteByte('B')
if err != nil {
fmt.Println("Error:", err)
return
}
err = bw.WriteByte('C')
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(buf.String())
}
Результат выполнения кода:
"ABC"
Пример
Рассмотрим пример записи байтов в файл. Тип os.File реализует интерфейс io.ByteWriter:
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.CreateTemp("", "example")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer os.Remove(file.Name())
defer file.Close()
var bw io.ByteWriter = file
_, err = bw.WriteByte('x')
if err != nil {
fmt.Println("Error writing byte:", err)
return
}
_, err = bw.WriteByte('y')
if err != nil {
fmt.Println("Error writing byte:", err)
return
}
_, err = bw.WriteByte('z')
if err != nil {
fmt.Println("Error writing byte:", err)
return
}
// Сбрасываем буферы и читаем содержимое
file.Sync()
file.Seek(0, 0)
data := make([]byte, 3)
file.Read(data)
fmt.Println(string(data))
}
Результат выполнения кода:
"xyz"
Пример
Используем io.MultiWriter для одновременной записи в несколько потоков.
Этот пример демонстрирует, как интерфейс позволяет комбинировать записи:
package main
import (
"bytes"
"fmt"
"io"
"os"
)
func main() {
var buf1 bytes.Buffer
var buf2 bytes.Buffer
multi := io.MultiWriter(&buf1, &buf2, os.Stdout)
var bw io.ByteWriter = multi
_ = bw.WriteByte('1')
_ = bw.WriteByte('2')
_ = bw.WriteByte('3')
fmt.Println()
fmt.Println("buf1:", buf1.String())
fmt.Println("buf2:", buf2.String())
}
Результат выполнения кода:
"123"
"buf1: 123"
"buf2: 123"
Смотрите также
-
интерфейс
io.Writer,
который позволяет записывать срезы байтов -
интерфейс
io.ByteReader,
который отвечает за чтение одного байта -
функцию
io.WriteString,
которая упрощает запись строк в поток -
тип
os.File,
предоставляющий методы для работы с файлами