Интерфейс io.ReadWriter
Интерфейс io.ReadWriter представляет собой объединение
двух базовых интерфейсов: io.Reader и io.Writer.
Тип, реализующий этот интерфейс, должен предоставлять методы
Read и Write, что делает его пригодным для
двустороннего обмена данными.
Особенность интерфейса в том, что он не добавляет новых методов, а лишь группирует существующие. Это позволяет передавать один и тот же объект в функции, которые ожидают как читателя, так и писателя.
Синтаксис
type ReadWriter interface {
Reader
Writer
}
Пример
Создадим простой буфер, который реализует io.ReadWriter,
и продемонстрируем последовательную запись и чтение данных:
package 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)
}
Результат выполнения кода:
"Hello, World!"
Пример
Используем io.ReadWriter для копирования данных
из одного места в другое с промежуточной обработкой:
package 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)
}
Результат выполнения кода:
"abcde"
Смотрите также
-
интерфейс
io.Reader,
предоставляющий методReadдля чтения данных -
интерфейс
io.Writer,
предоставляющий методWriteдля записи данных -
интерфейс
io.ReadCloser,
объединяющий чтение и закрытие ресурса -
интерфейс
io.WriteCloser,
объединяющий запись и закрытие ресурса