Advertisement
AlexNovoross87

read_wr_bufio

May 14th, 2025
573
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 6.46 KB | None | 0 0
  1. Чтение и запись
  2. Reader и Writer - это интерфейсы, которые позволяют чтение из и запись в источники ввода-вывода
  3. | Сетевые сокеты, файлы, произвольные массивы
  4. Множество реализаций в стандартной библиотеке
  5. Reader - это низкоуровневая реализация
  6. | Обычно предпочтительно работать с пакетом bufio вместо чтения напрямую из Reader
  7.  
  8. Интерфейсы
  9. -----------
  10. type Reader interface {
  11. Read(p []byte) (n int, err error)
  12. }
  13.  
  14. type Writer interface {
  15. Write(p []byte) (n int, err error)
  16. }
  17.  
  18. =============================================================
  19. Чтение
  20.  
  21. type Reader interface {
  22.     Read(p []byte) (n int, err error)
  23. }
  24.  
  25. Каждый вызов функции Read() будет заполнять предоставленный буфер р
  26. | Количество прочитанных байт будет возвращено в виде значения п
  27. Когда все байты будут прочитаны, err будет содержать значение io.EOF
  28.  
  29. ЧТОБЫ ПРОВЕРИТЬ СЧИТАЛИСЬ ЛИ ВСЕ БАЙТЫ ПРАВИЛЬНО - НАДО ПРОВЕРИТЬ СОДЕРЖИТ
  30. ЛИ err io.EOF . Если да, то чтение произошло успешно.
  31.  
  32.  
  33. import (
  34.     "fmt"
  35.     "io"
  36.     "strings"
  37. )
  38.  
  39. func rd() {
  40.  
  41.     /*
  42.             Создаётся объект reader типа *strings.Reader, который позволяет читать строку "SAMPLE" как поток байтов.
  43.             Это похоже на открытие файла или потока, но данные берутся из строки.
  44.     */
  45.     reader := strings.NewReader("SAMPLE")
  46.     /*
  47.             Создаётся объект newString для эффективной последовательной записи строк или байтов.
  48.             В конце мы используем его, чтобы собрать прочитанные данные в одну строку.
  49.     */
  50.     var newString strings.Builder
  51.  
  52.     /*
  53.             Создаётся объект newString для эффективной последовательной записи строк или байтов.
  54.             В конце мы используем его, чтобы собрать прочитанные данные в одну строку.
  55.     */
  56.     buffer := make([]byte, 4)
  57.  
  58.     for {
  59.         /*
  60.             вызывается метод Read у reader, который пытается прочитать до 4 байт
  61.             (размер буфера) из строки "SAMPLE".
  62.         */
  63.         numBytes, err := reader.Read(buffer)
  64.         /*
  65.             срез буффера numBytes - колво прочитанных байт (если прочитано 4 байт то numBytes
  66.             будет 4, если меньше - то меньше)
  67.         */
  68.         chunk := buffer[:numBytes]
  69.         /*
  70.             newString.Write(chunk) - записываем прочитанные байты в strings.Builder
  71.         */
  72.         newString.Write(chunk)
  73.         /*
  74.             Печатаем количество прочитаных байт и байты
  75.         */
  76.         fmt.Printf("Read %v bytes: %c\n", numBytes, chunk)
  77.  
  78.         //Если достигнут конец данных прерываем цикл
  79.         if err == io.EOF {
  80.             break
  81.         }
  82.     }
  83.     fmt.Printf(" %v \n", newString.String())
  84. }
  85.  
  86. =================================================================================
  87. bufio
  88. I Пакет bufio предоставляет буферизацию для чтения и записи с
  89. использованием типов Reader и Writer соответственно
  90.    | Необходимости вручную управлять буферами или создавать данные нет
  91.  
  92. func bforead() {
  93.  
  94.     /*
  95.             Создание источника данных
  96.             strings.NewReader("SAMPLE") создаёт объект io.Reader, который читает
  97.             данные из строки "SAMPLE" как из потока байтов
  98.     */
  99.     source := strings.NewReader("SAMPLE")
  100.  
  101.     /*
  102.         Оборачивание в буферизированный ридер bufio.NewReader(source)
  103.         создаёт буферизированный ридер, который оборачивает исходный io.Reader.
  104.         Это позволяет читать данные более эффективно и использовать дополнительные
  105.         методы, такие как ReadString
  106.     */
  107.     buffered := bufio.NewReader(source)
  108.     /*
  109.         Чтение строки до символа '\n'
  110.         Вызов buffered.ReadString('\n') пытается прочитать из буфера все байты до
  111.         первого вхождения символа новой строки '\n' (включая сам символ).
  112.         Если символ '\n' найден, функция возвращает строку до и включая этот символ, а err == nil.
  113.         Если символ '\n' не найден и достигнут конец потока, функция возвращает все
  114.         доступные данные и ошибку io.EOF.
  115.     */
  116.     newString, err := buffered.ReadString('\n')
  117.     if err == io.EOF {
  118.         fmt.Println(newString)
  119.     } else {
  120.         fmt.Println("something went wrong...")
  121.     }
  122.  
  123. }
  124.  
  125.  
  126. func bfosearch() {
  127.     // Read lines from standard input
  128.     //1. Создание сканера для чтения из стандартного ввода
  129.     scanner := bufio.NewScanner(os.Stdin)
  130.     //2. Создание среза для хранения строк
  131.     lines := make([]string, 0, 5)
  132.  
  133.     //Пока идет ввод
  134.     for scanner.Scan() {
  135.         lines = append(lines, scanner.Text())
  136.     }
  137.  
  138.     //Если произошла ошибка
  139.     if scanner.Err() != nil {
  140.         fmt.Println(scanner.Err())
  141.     }
  142.     //Сколько линий прочитано
  143.     fmt.Printf("Line count: %v\n", len(lines))
  144.  
  145.     //Печать линий
  146.     for _, line := range lines {
  147.         fmt.Printf("Line: %v\n", line)
  148.     }
  149.  
  150. }
  151.  
  152. //////////////////////////////////////////////////////////////
  153.  
  154. Запись
  155.  
  156. func bfread() {
  157.     //Создание нового буфера
  158.     buffer := bytes.NewBufferString("")
  159.     //Записать в буффер
  160.     numBytes, err := buffer.WriteString("SAMPLE")
  161.     if err != nil {
  162.         fmt.Println(err)
  163.     } else {
  164.         fmt.Printf("Wrote %v bytes: %c\n", numBytes, buffer)
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement