Тип bytes.Reader

Тип bytes.Reader реализует интерфейсы io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, io.ByteReader и io.RuneReader. Он создается с помощью функции bytes.NewReader, которая принимает срез байтов и возвращает указатель на bytes.Reader.

Основное назначение типа — предоставить возможность читать данные из строки (преобразованной в байтовый срез) как из потока. Это удобно, когда требуется посимвольное или поблочное чтение, а также перемещение позиции чтения.

Синтаксис

gor := bytes.NewReader([]byte("some string"))

Пример

Давайте создадим bytes.Reader из строки и прочитаем из него данные в байтовый срез:

gopackage main

import (
  "bytes"
  "fmt"
)

func main() {
  data := []byte("abcde")
  r := bytes.NewReader(data)

  buf := make([]byte, 3)
  n, err := r.Read(buf)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Read %d bytes: %s\n", n, buf[:n])
}

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

go"Read 3 bytes: abc"

Пример

Давайте используем метод Seek для перемещения позиции чтения в середину строки и прочитаем остаток:

gopackage main

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

func main() {
  data := []byte("abcde")
  r := bytes.NewReader(data)

  // Перемещаем позицию на 2 байта от начала
  _, err := r.Seek(2, io.SeekStart)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  buf := make([]byte, 3)
  n, err := r.Read(buf)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Read %d bytes: %s\n", n, buf[:n])
}

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

go"Read 3 bytes: cde"

Пример

Давайте прочитаем всю строку целиком с помощью метода ReadAll из пакета io, используя bytes.Reader как источник:

gopackage main

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

func main() {
  data := []byte("abcde")
  r := bytes.NewReader(data)

  res, err := io.ReadAll(r)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("%s\n", res)
}

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

go"abcde"

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

  • тип bytes.Buffer,
    который используется для накопления данных в буфере
  • функцию bytes.NewReader,
    которая создает новый bytes.Reader из среза байтов
  • тип strings.Reader,
    который предоставляет аналогичную функциональность для строк
  • функцию bytes.Clone,
    которая создает копию среза байтов