Интерфейс io.ByteWriter

Интерфейс io.ByteWriter определяет контракт для записи одного байта в некоторый поток данных. Он содержит единственный метод WriteByte, который принимает байт (тип byte) и возвращает ошибку, если запись не удалась. Этот интерфейс часто используется для низкоуровневой записи данных, например, при работе с файлами, сетевыми соединениями или буферами. Метод WriteByte позволяет записывать данные по одному байту, что может быть полезно при построении бинарных протоколов или сериализации.

Синтаксис

gotype ByteWriter interface {
  WriteByte(c byte) error
}

Метод WriteByte принимает один аргумент — байт для записи. Возвращает ошибку, если запись завершилась неудачей.

Пример

Создадим буфер и запишем в него отдельные байты с использованием io.ByteWriter. Стандартный тип bytes.Buffer реализует этот интерфейс:

gopackage 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())
}

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

go"ABC"

Пример

Рассмотрим пример записи байтов в файл. Тип os.File реализует интерфейс io.ByteWriter:

gopackage 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))
}

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

go"xyz"

Пример

Используем io.MultiWriter для одновременной записи в несколько потоков. Этот пример демонстрирует, как интерфейс позволяет комбинировать записи:

gopackage 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())
}

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

go"123"
"buf1: 123"
"buf2: 123"

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

  • интерфейс io.Writer,
    который позволяет записывать срезы байтов
  • интерфейс io.ByteReader,
    который отвечает за чтение одного байта
  • функцию io.WriteString,
    которая упрощает запись строк в поток
  • тип os.File,
    предоставляющий методы для работы с файлами