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

Интерфейс io.ReadWriter представляет собой объединение двух базовых интерфейсов: io.Reader и io.Writer. Тип, реализующий этот интерфейс, должен предоставлять методы Read и Write, что делает его пригодным для двустороннего обмена данными.

Особенность интерфейса в том, что он не добавляет новых методов, а лишь группирует существующие. Это позволяет передавать один и тот же объект в функции, которые ожидают как читателя, так и писателя.

Синтаксис

gotype ReadWriter interface {
  Reader
  Writer
}

Пример

Создадим простой буфер, который реализует io.ReadWriter, и продемонстрируем последовательную запись и чтение данных:

gopackage main

import (
  "bytes"
  "fmt"
  "io"
)

func main() {
  // Буфер реализует io.ReadWriter
  var rw io.ReadWriter = bytes.NewBuffer(nil)

  // Записываем данные
  rw.Write([]byte("Hello, World!"))

  // Читаем данные
  buf := make([]byte, 20)
  n, err := rw.Read(buf)
  if err != nil && err != io.EOF {
    fmt.Println(err)
    return
  }

  res := string(buf[:n])
  fmt.Println(res)
}

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

go"Hello, World!"

Пример

Используем io.ReadWriter для копирования данных из одного места в другое с промежуточной обработкой:

gopackage main

import (
  "bytes"
  "fmt"
  "io"
)

func main() {
  src := bytes.NewBufferString("abcde")
  dst := bytes.NewBuffer(nil)

  // Преобразуем dst к io.ReadWriter
  var rw io.ReadWriter = dst

  // Копируем данные из src в dst
  _, err := io.Copy(rw, src)
  if err != nil {
    fmt.Println(err)
    return
  }

  // Читаем из dst через интерфейс ReadWriter
  buf := make([]byte, 10)
  n, err := rw.Read(buf)
  if err != nil && err != io.EOF {
    fmt.Println(err)
    return
  }

  res := string(buf[:n])
  fmt.Println(res)
}

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

go"abcde"

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

  • интерфейс io.Reader,
    предоставляющий метод Read для чтения данных
  • интерфейс io.Writer,
    предоставляющий метод Write для записи данных
  • интерфейс io.ReadCloser,
    объединяющий чтение и закрытие ресурса
  • интерфейс io.WriteCloser,
    объединяющий запись и закрытие ресурса