Ответ
В Go строки представляют собой иммутабельные (неизменяемые) последовательности байт в кодировке UTF-8. Существует несколько основных способов работы с их содержимым:
-
Итерация по символам (рунам) Наиболее идиоматичный способ перебрать строку посимвольно — это цикл
for ... range
. Он автоматически декодирует UTF-8 последовательности в руны (rune
).for index, r := range "Привет, мир!" { // r имеет тип rune (псевдоним int32) fmt.Printf("Позиция %d: символ %cn", index, r) }
-
Получение подстроки (среза) Можно получить часть строки, используя синтаксис срезов
str[i:j]
. Важно помнить, что индексыi
иj
— это байтовые смещения, а не позиции символов. Неосторожное использование срезов может "разрезать" многобайтовый символ.str := "Hello, World!" // Получаем подстроку с 0 по 5 байт (не включая 5) substr := str[0:5] // "Hello"
-
Чтение из
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)
-
-
Доступ по байтовому индексу Можно получить доступ к отдельному байту строки, но это будет значение типа
byte
(uint8
), а неrune
. Это полезно для ASCII-строк, но не для Unicode.str := "Hello" firstByte := str[0] // 72 (код 'H') fmt.Printf("Тип: %T, значение: %v", firstByte, firstByte) // Вывод: Тип: uint8, значение: 72