Метод bufio.Reader.Peek

Метод bufio.Reader.Peek позволяет заглянуть в буфер и прочитать указанное количество байт n, не сдвигая указатель чтения. Это значит, что последующие вызовы методов чтения (например, Read или ReadString) увидят те же самые данные. Метод возвращает срез байт и ошибку. Если в буфере меньше n байт, метод вернет все доступные байты и ошибку ErrBufferFull. Если при попытке заполнить буфер возникнет ошибка, она также будет возвращена.

Синтаксис

gopeeked, err := reader.Peek(n)

Пример использования

Давайте создадим буферизированный читатель из строки и заглянем в первые 5 байт без их извлечения:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  r := bufio.NewReader(strings.NewReader("0123456789"))
  peeked, err := r.Peek(5)
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Printf("peeked: %q\n", peeked)
}

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

go"peeked: \"01234\""

Пример с ошибкой ErrBufferFull

Если запросить больше байт, чем есть в буфере, метод вернет ошибку ErrBufferFull, но при этом вернет все доступные байты:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  r := bufio.NewReader(strings.NewReader("abc"))
  peeked, err := r.Peek(10)
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Printf("peeked: %q\n", peeked)
}

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

go"Error: bufio: buffer full"
"peeked: \"abc\""

Пример подтверждения, что Peek не двигает указатель

Покажем, что после вызова Peek последующий вызов ReadString считывает те же данные с самого начала:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  r := bufio.NewReader(strings.NewReader("hello world"))
  peeked, _ := r.Peek(5)
  fmt.Printf("peeked: %q\n", peeked)

  line, _ := r.ReadString(' ')
  fmt.Printf("read: %q\n", line)
}

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

go"peeked: \"hello\""
"read: \"hello \""

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

  • метод bufio.Reader.Read,
    который читает данные в переданный срез
  • метод bufio.Reader.ReadString,
    который читает строку до разделителя
  • метод bufio.Reader.Discard,
    который пропускает указанное количество байт без чтения
  • метод bufio.Reader.Buffered,
    который возвращает количество байт в буфере