Ответ
В Go строки — это неизменяемые (immutable) последовательности байт, обычно в кодировке UTF-8. Неизменяемость означает, что любая операция, "модифицирующая" строку, на самом деле создает новую.
Основные операции:
-
Конкатенация (объединение) Используется оператор
+
или более эффективная функцияstrings.Join
для множества строк.s1 := "Hello" s2 := "World" result := s1 + " " + s2 // "Hello World"
-
Получение длины в байтах Функция
len()
возвращает количество байт, а не символов. Для кириллических символов это важно.// Строка "Привет" в UTF-8 занимает 12 байт (6 символов * 2 байта/символ) lengthInBytes := len("Привет") // 12
-
Подсчёт символов (рун) Для корректного подсчета символов в UTF-8 строке используется пакет
unicode/utf8
.import "unicode/utf8" runeCount := utf8.RuneCountInString("Привет") // 6
-
Итерирование Цикл
for ... range
безопасно итерирует по рунам (символам), а не по байтам.for index, runeValue := range "Go-руны" { fmt.Printf("На позиции %d стоит руна %cn", index, runeValue) }
-
Доступ к байтам и срезы Можно получить байт по индексу или подстроку (срез). Операция среза создает новую строку.
s := "abcdef" b := s[1] // 98 (байт, соответствующий 'b') sub := s[1:4] // "bcd"
-
Сравнение Строки можно сравнивать лексикографически с помощью
==
,!=
,<
,>
."abc" == "abc" // true "a" < "b" // true
-
Преобразование типов Строки можно эффективно преобразовывать в срез байт и обратно.
bytes := []byte("text") str := string(bytes)
-
Пакет
strings
Для более сложных операций (поиск, замена, разделение, удаление пробелов) используется стандартный пакетstrings
.import "strings" strings.Contains("hello world", "world") // true strings.ReplaceAll("a-b-c", "-", ",") // "a,b,c"
Важно: Для многократного построения строк (например, в цикле) используйте strings.Builder
, чтобы избежать лишних аллокаций памяти.