cpp

Структура Reader

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

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

strings.NewReader(s string) *strings.Reader

Пример:

// import "os"
buf := strings.NewReader("test")
buf.WriteTo(os.Stdout) // test

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

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

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

Пример:

arr := []byte{0, 0}
buf := strings.NewReader("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. Формат метода:
(*strings.Reader).ReadAt(b []byte, off int64) (n int, err error)

Пример:

arr := []byte{0, 0}
buf := strings.NewReader("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. Формат метода:
(*strings.Reader).ReadByte() (byte, error)

Пример:

buf := strings.NewReader("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() — отменяет чтение последнего байта. Формат метода:
(*strings.Reader).UnreadByte() error

Пример:

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

Пример:

buf := strings.NewReader("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() — отменяет чтение последнего символа. Формат метода:
(*strings.Reader).UnreadRune() error

Пример:

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

Пример:

arr := []byte{0, 0}
buf := strings.NewReader("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 := strings.NewReader("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

Можно также воспользоваться методами структуры Reader из пакета bufio (см. разд. 14.11):

buf := strings.NewReader("Строка1\r\nСтрока2\nСтрока3")
reader := bufio.NewReader(buf)
line, _, _ := reader.ReadLine()
fmt.Printf("%q\n", line) // "Строка1"

Замена содержимого буфера

Заменить содержимое буфера можно с помощью метода Reset(). Формат метода:

(*strings.Reader).Reset(s string)

Пример:

buf := strings.NewReader("test")
buf.WriteTo(os.Stdout) // test
buf.Reset("word")
buf.WriteTo(os.Stdout) // word

Получение размера буфера

Получить размер непрочитанной части буфера в байтах позволяет метод Len(). Формат метода:

(*strings.Reader).Len() int

Пример:

buf := strings.NewReader("test тест")
fmt.Println(buf.Len())      // 13
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.Len())      // 12

Для получения полного размера буфера можно воспользоваться методом Size(). Формат метода:

(*strings.Reader).Size() int64

Пример:

buf := strings.NewReader("test тест")
fmt.Println(buf.Size())     // 13
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.Size())     // 13

Запись содержимого буфера в поток

Записать содержимое буфера в поток позволяет метод WriteTo(). Формат метода:

(*strings.Reader).WriteTo(w io.Writer) (n int64, err error)

Через переменную n доступно число записанных байтов, а через переменную err — описание ошибки. Пример записи в стандартный поток вывода os.Stdout:

// import "os"
buf := strings.NewReader("test тест ")
fmt.Println(buf.WriteTo(os.Stdout)) // test тест 14 <nil>

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

Помощь сайту

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

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

cpp