Функция bytes.NewReader

Функция bytes.NewReader создает новый Reader, который читает данные из переданного байтового среза. В единственный параметр функция принимает байтовый срез []byte, из которого будет производиться чтение. Возвращаемое значение - указатель на структуру bytes.Reader, реализующую интерфейсы io.Reader, io.Seeker и io.ReaderAt.

Синтаксис

gofunc NewReader(b []byte) *Reader

Пример

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

gopackage main

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

func main() {
  data := []byte("Hello, Go!")
  reader := bytes.NewReader(data)

  buf := make([]byte, len(data))
  n, err := reader.Read(buf)
  if err != nil && err != io.EOF {
    fmt.Println("Error:", err)
    return
  }

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

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

go"Read 10 bytes: Hello, Go!"

Пример

Создадим Reader и прочитаем данные по частям, используя метод Read:

gopackage main

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

func main() {
  data := []byte("1234567890")
  reader := bytes.NewReader(data)

  buf := make([]byte, 3)
  for {
    n, err := reader.Read(buf)
    if err == io.EOF {
      break
    }
    if err != nil {
      fmt.Println("Error:", err)
      return
    }
    fmt.Printf("Read: %s\n", string(buf[:n]))
  }
}

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

go"Read: 123"
"Read: 456"
"Read: 789"
"Read: 0"

Пример

Используем методы Seek и Read для чтения с определенной позиции:

gopackage main

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

func main() {
  data := []byte("abcdefghij")
  reader := bytes.NewReader(data)

  // Перемещаем указатель на 3 байта от начала
  _, err := reader.Seek(3, io.SeekStart)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  buf := make([]byte, 4)
  n, err := reader.Read(buf)
  if err != nil && err != io.EOF {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Read from position 3: %s\n", string(buf[:n]))
}

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

go"Read from position 3: defg"

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

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