Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Структура 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>
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов