В Go операция сложения строк (+
) выполняет конкатенацию - создание новой строки, содержащей содержимое всех складываемых строк:
s1 := "Hello"
s2 := "World"
result := s1 + " " + s2 // "Hello World"
Каждое сложение создает новую строку, что может быть неэффективно в циклах:
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() // Однократное создание строки
Компилятор Go применяет специальные оптимизации для случаев:
Пример оптимизации:
s := "Hello" + " " + "World"
// Компилятор может заменить на:
s := "Hello World"
Go не позволяет напрямую складывать строки с другими типами. Необходимо явное преобразование:
i := 42
s := "Number: " + string(i) // НЕВЕРНО! Получим символ с кодом 42
s := "Number: " + strconv.Itoa(i) // Верно
Для литералов можно использовать простое сложение:
s := "This is a " +
"multiline " +
"string"
После сложения в памяти будет существовать:
+
) создает новую строку-результат конкатенацииstrings.Builder