Почему строки в Go неизменяемы и как их можно «изменить»?

Ответ

Строки в Go неизменяемы (immutable). Это означает, что после создания строки ее содержимое нельзя изменить. Такое решение было принято для обеспечения безопасности (например, для использования строк в качестве ключей в map) и для упрощения управления памятью.

Любая операция, которая выглядит как изменение строки, на самом деле создает новую строку в памяти. Вот основные способы работы со строками:

  1. Преобразование в срез рун или байт Это основной способ для изменения отдельных символов. Важно различать:

    • []rune: для работы с многобайтными символами (Unicode, кириллица, эмодзи).
    • []byte: для работы с ASCII или когда важна производительность и вы уверены, что символы однобайтовые.
    s := "привет"
    r := []rune(s) // Преобразуем в срез рун
    r[0] = 'П'       // Изменяем элемент среза
    s = string(r)   // Создаем новую строку: "Привет"
  2. Конкатенация и strings.Builder Для простого сложения можно использовать оператор +. Однако для построения строк в цикле или из множества частей гораздо эффективнее использовать strings.Builder, так как он позволяет избежать многократного выделения памяти.

    var b strings.Builder
    b.WriteString("Hello, ")
    b.WriteString("World!")
    s := b.String() // "Hello, World!"
  3. Использование функций из пакета strings Пакет strings предоставляет множество готовых функций для работы со строками, которые также возвращают новые строки.

    s := "hello, world"
    s = strings.Replace(s, "hello", "goodbye", 1) // "goodbye, world"
    s = strings.ToUpper(s) // "GOODBYE, WORLD"