cpp

Структура Reader

Структура Reader описывает байтовый буфер доступный только для чтения и реализует все методы из интерфейсов io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, io.ByteScanner и io.RuneScanner. Это означает, что мы можем передать буфер везде, где ожидаются эти интерфейсы, например, в качестве потока для ввода данных.

Создать объект буфера позволяет функция NewReader(). Формат функции:

bytes.NewReader(b []byte) *bytes.Reader

Пример:

// import "os"
buf := bytes.NewReader([]byte("test"))
buf.WriteTo(os.Stdout) // test

Reader. Получение содержимого буфера

Получить содержимое буфера позволяют следующие методы:

  • Read() — при каждом вызове записывает в слайс b следующие len(b) байтов. Метод возвращает два значения. Через n доступно число считанных байтов. Через err можно получить информацию об ошибке. Если в буфере больше нет данных, то значением err будет io.EOF. Если ошибки не возникло, то значением err будет nil. Формат метода:
(*bytes.Reader).Read(b []byte) (n int, err error)

Пример:

arr := []byte{0, 0}
buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.Read(arr)) // 2 <nil>
fmt.Println(arr)           // [116 101]
fmt.Println(buf.Read(arr)) // 2 <nil>
fmt.Println(arr)           // [115 116]
fmt.Println(buf.Read(arr)) // 0 EOF
  • ReadAt() — записывает в слайс b len(b) байтов, начиная с позиции off. Метод возвращает два значения. Через n доступно число считанных байтов. Через err можно получить информацию об ошибке. Если в буфере больше нет данных, то значением err будет io.EOF. Если ошибки не возникло, то значением err будет nil. Формат метода:
(*bytes.Reader).ReadAt(b []byte, off int64) (n int, err error)

Пример:

arr := []byte{0, 0}
buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.ReadAt(arr, 0)) // 2 <nil>
fmt.Println(arr)                // [116 101]
fmt.Println(buf.ReadAt(arr, 2)) // 2 <nil>
fmt.Println(arr)                // [115 116]
fmt.Println(buf.ReadAt(arr, 4)) // 0 EOF
  • ReadByte() — при каждом вызове через первое возвращаемое значение доступен следующий байт. Через второе возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будет io.EOF. Если ошибки не возникло, то значением будет nil. Формат метода:
(*bytes.Reader).ReadByte() (byte, error)

Пример:

buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.ReadByte()) // 101 <nil>
fmt.Println(buf.ReadByte()) // 115 <nil>
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.ReadByte()) // 0 EOF
  • UnreadByte() — отменяет чтение последнего байта. Формат метода:
(*bytes.Reader).UnreadByte() error

Пример:

buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.ReadByte())   // 116 <nil>
fmt.Println(buf.UnreadByte()) // <nil>
fmt.Println(buf.ReadByte())   // 116 <nil>
  • ReadRune() — при каждом вызове через первое возвращаемое значение доступен следующий символ. Через второе возвращаемое значение доступно число байтов. Через третье возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будет io.EOF. Если ошибки не возникло, то значением будет nil. Формат метода:
(*bytes.Reader).ReadRune() (ch rune, size int, err error)

Пример:

buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.ReadRune()) // 116 1 <nil>
fmt.Println(buf.ReadRune()) // 101 1 <nil>
fmt.Println(buf.ReadRune()) // 115 1 <nil>
fmt.Println(buf.ReadRune()) // 116 1 <nil>
fmt.Println(buf.ReadRune()) // 0 0 EOF
  • UnreadRune() — отменяет чтение последнего символа. Формат метода:
(*bytes.Reader).UnreadRune() error

Пример:

buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.ReadRune())   // 116 1 <nil>
fmt.Println(buf.UnreadRune()) // <nil>
fmt.Println(buf.ReadRune())   // 116 1 <nil>
  • Seek() — позволяет задать позицию указателя внутри буфера. Формат метода:
(*bytes.Reader).Seek(offset int64, whence int) (int64, error)

Пример:

arr := []byte{0, 0}
buf := bytes.NewReader([]byte("test"))
fmt.Println(buf.Read(arr))  // 2 <nil>
fmt.Println(arr)            // [116 101]
// Перемещаем указатель в начало буфера
fmt.Println(buf.Seek(0, 0)) // 0 <nil>
fmt.Println(buf.Read(arr))  // 2 <nil>
fmt.Println(arr)            // [116 101]

Прочитать содержимое буфера позволяют также функции Fscan(), Fscanln() и Fscanf() из пакета fmt (описание функций приведено в разд. 14.4):

buf := bytes.NewReader([]byte("10 20"))
x, y := 0, 0
n, err := fmt.Fscanf(buf, "%d %d", &x, &y)
fmt.Println(n, err) // 2 <nil>
fmt.Println(x, y)   // 10 20

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp