Тип bufio.ReadWriter
Тип bufio.ReadWriter представляет собой комбинированный буферизированный поток,
который объединяет в себе bufio.Reader и bufio.Writer.
Этот тип позволяет одновременно выполнять буферизированное чтение и запись данных
через один объект. Он часто используется в сетевых протоколах,
где необходимо быстро читать запросы и отправлять ответы.
Создание ReadWriter
Для создания экземпляра bufio.ReadWriter используется функция
bufio.NewReadWriter. Она принимает два аргумента:
указатель на bufio.Reader и указатель на bufio.Writer,
которые будут использоваться для операций ввода-вывода.
Синтаксис
bufio.NewReadWriter(r *bufio.Reader, w *bufio.Writer) *bufio.ReadWriter
Пример
Давайте создадим bufio.ReadWriter на основе буферизированного
читателя и писателя, затем запишем строку и прочитаем её обратно:
package 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)
}
Результат выполнения кода:
"Hello "
Пример
Используем bufio.ReadWriter для построчного чтения
и записи данных в сетевом соединении:
package 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")
}
Результат выполнения кода:
"ReadWriter example"
Важные особенности
При работе с bufio.ReadWriter необходимо учитывать,
что чтение и запись используют общий буфер. После записи
данных всегда вызывайте Flush, чтобы гарантировать
запись всех данных в нижележащий поток. При чтении данных
буферизированный читатель будет читать из того же источника,
в который происходит запись, что может привести к неожиданным
результатам, если не управлять потоком данных правильно.
Смотрите также
-
тип
bufio.Reader,
который предоставляет буферизированное чтение данных -
тип
bufio.Writer,
который предоставляет буферизированную запись данных -
функцию
bufio.NewReadWriter,
которая создает новый экземпляр ReadWriter -
тип
bufio.Scanner,
который предоставляет удобный интерфейс для чтения токенов