Ответ
Строки в Go неизменяемы (immutable). Это означает, что после создания строки ее содержимое нельзя изменить. Такое решение было принято для обеспечения безопасности (например, для использования строк в качестве ключей в map
) и для упрощения управления памятью.
Любая операция, которая выглядит как изменение строки, на самом деле создает новую строку в памяти. Вот основные способы работы со строками:
-
Преобразование в срез рун или байт Это основной способ для изменения отдельных символов. Важно различать:
[]rune
: для работы с многобайтными символами (Unicode, кириллица, эмодзи).[]byte
: для работы с ASCII или когда важна производительность и вы уверены, что символы однобайтовые.
s := "привет" r := []rune(s) // Преобразуем в срез рун r[0] = 'П' // Изменяем элемент среза s = string(r) // Создаем новую строку: "Привет"
-
Конкатенация и
strings.Builder
Для простого сложения можно использовать оператор+
. Однако для построения строк в цикле или из множества частей гораздо эффективнее использоватьstrings.Builder
, так как он позволяет избежать многократного выделения памяти.var b strings.Builder b.WriteString("Hello, ") b.WriteString("World!") s := b.String() // "Hello, World!"
-
Использование функций из пакета
strings
Пакетstrings
предоставляет множество готовых функций для работы со строками, которые также возвращают новые строки.s := "hello, world" s = strings.Replace(s, "hello", "goodbye", 1) // "goodbye, world" s = strings.ToUpper(s) // "GOODBYE, WORLD"