Что будет если сложить строки?go-18

Что происходит при сложении строк?

В Go операция сложения строк (+) выполняет конкатенацию - создание новой строки, содержащей содержимое всех складываемых строк:

s1 := "Hello"
s2 := "World"
result := s1 + " " + s2  // "Hello World"

Подробный механизм работы:

  1. Выделение памяти: Создается новый буфер в памяти, размер которого равен сумме длин всех складываемых строк
  2. Копирование данных: В новый буфер последовательно копируются:
    • Байты из первой строки
    • Байты из второй строки
    • И так далее для всех операндов
  3. Создание строки: Формируется новая строковая структура, ссылающаяся на созданный буфер

Особенности и подводные камни

1. Производительность при множественной конкатенации

Каждое сложение создает новую строку, что может быть неэффективно в циклах:

var s string
for i := 0; i < 1000; i++ {
    s += "x"  // Каждая итерация создает новую строку!
}

Решение: Использовать strings.Builder:

var builder strings.Builder
for i := 0; i < 1000; i++ {
    builder.WriteString("x")
}
s := builder.String()  // Однократное создание строки

2. Оптимизации компилятора

Компилятор Go применяет специальные оптимизации для случаев:

  • Сложения строковых литералов
  • Конкатенации небольшого числа строк

Пример оптимизации:

s := "Hello" + " " + "World"
// Компилятор может заменить на:
s := "Hello World"

3. Сложение с другими типами

Go не позволяет напрямую складывать строки с другими типами. Необходимо явное преобразование:

i := 42
s := "Number: " + string(i)  // НЕВЕРНО! Получим символ с кодом 42
s := "Number: " + strconv.Itoa(i)  // Верно

4. Сложение многострочных строк

Для литералов можно использовать простое сложение:

s := "This is a " +
     "multiline " +
     "string"

Внутреннее представление

После сложения в памяти будет существовать:

  1. Новая строка с объединенным содержимым
  2. Исходные строки останутся неизменными (так как строки в Go immutable)

Резюмируем

  1. Сложение строк (+) создает новую строку-результат конкатенации
  2. Каждая операция сложения выделяет новую память
  3. Для частых конкатенаций используйте strings.Builder
  4. Компилятор оптимизирует некоторые случаи сложения
  5. Нельзя напрямую складывать строки с другими типами
  6. Исходные строки остаются неизменными благодаря immutable-природе строк в Go