Тип bufio.ReadWriter

Тип bufio.ReadWriter представляет собой комбинированный буферизированный поток, который объединяет в себе bufio.Reader и bufio.Writer. Этот тип позволяет одновременно выполнять буферизированное чтение и запись данных через один объект. Он часто используется в сетевых протоколах, где необходимо быстро читать запросы и отправлять ответы.

Создание ReadWriter

Для создания экземпляра bufio.ReadWriter используется функция bufio.NewReadWriter. Она принимает два аргумента: указатель на bufio.Reader и указатель на bufio.Writer, которые будут использоваться для операций ввода-вывода.

Синтаксис

gobufio.NewReadWriter(r *bufio.Reader, w *bufio.Writer) *bufio.ReadWriter

Пример

Давайте создадим bufio.ReadWriter на основе буферизированного читателя и писателя, затем запишем строку и прочитаем её обратно:

gopackage main

import (
  "bufio"
  "bytes"
  "fmt"
)

func main() {
  var buf bytes.Buffer
  reader := bufio.NewReader(&buf)
  writer := bufio.NewWriter(&buf)
  rw := bufio.NewReadWriter(reader, writer)

  // Write data
  rw.WriteString("Hello World")
  rw.Flush()

  // Read data
  err := rw.UnreadByte()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  data, err := rw.ReadString(' ')
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(data)
}

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

go"Hello "

Пример

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

gopackage main

import (
  "bufio"
  "fmt"
  "net"
)

func handleConnection(conn net.Conn) {
  defer conn.Close()
  rw := bufio.NewReadWriter(
    bufio.NewReader(conn),
    bufio.NewWriter(conn),
  )

  // Read a line from client
  line, err := rw.ReadString('\n')
  if err != nil {
    fmt.Println("Read error:", err)
    return
  }
  fmt.Printf("Received: %s", line)

  // Write response
  response := "Echo: " + line
  rw.WriteString(response)
  rw.Flush()
}

func main() {
  // This example shows the pattern,
  // actual server setup is omitted for brevity
  fmt.Println("ReadWriter example")
}

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

go"ReadWriter example"

Важные особенности

При работе с bufio.ReadWriter необходимо учитывать, что чтение и запись используют общий буфер. После записи данных всегда вызывайте Flush, чтобы гарантировать запись всех данных в нижележащий поток. При чтении данных буферизированный читатель будет читать из того же источника, в который происходит запись, что может привести к неожиданным результатам, если не управлять потоком данных правильно.

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

  • тип bufio.Reader,
    который предоставляет буферизированное чтение данных
  • тип bufio.Writer,
    который предоставляет буферизированную запись данных
  • функцию bufio.NewReadWriter,
    которая создает новый экземпляр ReadWriter
  • тип bufio.Scanner,
    который предоставляет удобный интерфейс для чтения токенов