Какие существуют способы для чтения и обработки строк в Go?

Ответ

В Go строки представляют собой иммутабельные (неизменяемые) последовательности байт в кодировке UTF-8. Существует несколько основных способов работы с их содержимым:

  1. Итерация по символам (рунам) Наиболее идиоматичный способ перебрать строку посимвольно — это цикл for ... range. Он автоматически декодирует UTF-8 последовательности в руны (rune).

    for index, r := range "Привет, мир!" {
        // r имеет тип rune (псевдоним int32)
        fmt.Printf("Позиция %d: символ %cn", index, r)
    }
  2. Получение подстроки (среза) Можно получить часть строки, используя синтаксис срезов str[i:j]. Важно помнить, что индексы i и j — это байтовые смещения, а не позиции символов. Неосторожное использование срезов может "разрезать" многобайтовый символ.

    str := "Hello, World!"
    // Получаем подстроку с 0 по 5 байт (не включая 5)
    substr := str[0:5] // "Hello"
  3. Чтение из io.Reader (файл, консоль, сетевое соединение) Для чтения строк из внешних источников используются пакеты os и bufio.

    • Чтение из консоли:

      import (
          "bufio"
          "os"
          "strings"
      )
      
      reader := bufio.NewReader(os.Stdin)
      fmt.Print("Введите текст: ")
      input, _ := reader.ReadString('n')
      input = strings.TrimSpace(input) // Очистка от пробелов и символа новой строки
    • Чтение всего файла в строку:

      import "os"
      
      data, err := os.ReadFile("file.txt")
      if err != nil {
          // Обработка ошибки
      }
      content := string(data)
  4. Доступ по байтовому индексу Можно получить доступ к отдельному байту строки, но это будет значение типа byte (uint8), а не rune. Это полезно для ASCII-строк, но не для Unicode.

    str := "Hello"
    firstByte := str[0] // 72 (код 'H')
    fmt.Printf("Тип: %T, значение: %v", firstByte, firstByte) 
    // Вывод: Тип: uint8, значение: 72