Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Чтение и запись
- Reader и Writer - это интерфейсы, которые позволяют чтение из и запись в источники ввода-вывода
- | Сетевые сокеты, файлы, произвольные массивы
- Множество реализаций в стандартной библиотеке
- Reader - это низкоуровневая реализация
- | Обычно предпочтительно работать с пакетом bufio вместо чтения напрямую из Reader
- Интерфейсы
- -----------
- type Reader interface {
- Read(p []byte) (n int, err error)
- }
- type Writer interface {
- Write(p []byte) (n int, err error)
- }
- =============================================================
- Чтение
- type Reader interface {
- Read(p []byte) (n int, err error)
- }
- Каждый вызов функции Read() будет заполнять предоставленный буфер р
- | Количество прочитанных байт будет возвращено в виде значения п
- Когда все байты будут прочитаны, err будет содержать значение io.EOF
- ЧТОБЫ ПРОВЕРИТЬ СЧИТАЛИСЬ ЛИ ВСЕ БАЙТЫ ПРАВИЛЬНО - НАДО ПРОВЕРИТЬ СОДЕРЖИТ
- ЛИ err io.EOF . Если да, то чтение произошло успешно.
- import (
- "fmt"
- "io"
- "strings"
- )
- func rd() {
- /*
- Создаётся объект reader типа *strings.Reader, который позволяет читать строку "SAMPLE" как поток байтов.
- Это похоже на открытие файла или потока, но данные берутся из строки.
- */
- reader := strings.NewReader("SAMPLE")
- /*
- Создаётся объект newString для эффективной последовательной записи строк или байтов.
- В конце мы используем его, чтобы собрать прочитанные данные в одну строку.
- */
- var newString strings.Builder
- /*
- Создаётся объект newString для эффективной последовательной записи строк или байтов.
- В конце мы используем его, чтобы собрать прочитанные данные в одну строку.
- */
- buffer := make([]byte, 4)
- for {
- /*
- вызывается метод Read у reader, который пытается прочитать до 4 байт
- (размер буфера) из строки "SAMPLE".
- */
- numBytes, err := reader.Read(buffer)
- /*
- срез буффера numBytes - колво прочитанных байт (если прочитано 4 байт то numBytes
- будет 4, если меньше - то меньше)
- */
- chunk := buffer[:numBytes]
- /*
- newString.Write(chunk) - записываем прочитанные байты в strings.Builder
- */
- newString.Write(chunk)
- /*
- Печатаем количество прочитаных байт и байты
- */
- fmt.Printf("Read %v bytes: %c\n", numBytes, chunk)
- //Если достигнут конец данных прерываем цикл
- if err == io.EOF {
- break
- }
- }
- fmt.Printf(" %v \n", newString.String())
- }
- =================================================================================
- bufio
- I Пакет bufio предоставляет буферизацию для чтения и записи с
- использованием типов Reader и Writer соответственно
- | Необходимости вручную управлять буферами или создавать данные нет
- func bforead() {
- /*
- Создание источника данных
- strings.NewReader("SAMPLE") создаёт объект io.Reader, который читает
- данные из строки "SAMPLE" как из потока байтов
- */
- source := strings.NewReader("SAMPLE")
- /*
- Оборачивание в буферизированный ридер bufio.NewReader(source)
- создаёт буферизированный ридер, который оборачивает исходный io.Reader.
- Это позволяет читать данные более эффективно и использовать дополнительные
- методы, такие как ReadString
- */
- buffered := bufio.NewReader(source)
- /*
- Чтение строки до символа '\n'
- Вызов buffered.ReadString('\n') пытается прочитать из буфера все байты до
- первого вхождения символа новой строки '\n' (включая сам символ).
- Если символ '\n' найден, функция возвращает строку до и включая этот символ, а err == nil.
- Если символ '\n' не найден и достигнут конец потока, функция возвращает все
- доступные данные и ошибку io.EOF.
- */
- newString, err := buffered.ReadString('\n')
- if err == io.EOF {
- fmt.Println(newString)
- } else {
- fmt.Println("something went wrong...")
- }
- }
- func bfosearch() {
- // Read lines from standard input
- //1. Создание сканера для чтения из стандартного ввода
- scanner := bufio.NewScanner(os.Stdin)
- //2. Создание среза для хранения строк
- lines := make([]string, 0, 5)
- //Пока идет ввод
- for scanner.Scan() {
- lines = append(lines, scanner.Text())
- }
- //Если произошла ошибка
- if scanner.Err() != nil {
- fmt.Println(scanner.Err())
- }
- //Сколько линий прочитано
- fmt.Printf("Line count: %v\n", len(lines))
- //Печать линий
- for _, line := range lines {
- fmt.Printf("Line: %v\n", line)
- }
- }
- //////////////////////////////////////////////////////////////
- Запись
- func bfread() {
- //Создание нового буфера
- buffer := bytes.NewBufferString("")
- //Записать в буффер
- numBytes, err := buffer.WriteString("SAMPLE")
- if err != nil {
- fmt.Println(err)
- } else {
- fmt.Printf("Wrote %v bytes: %c\n", numBytes, buffer)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement