Строки в Go иммутабельны. При конкатенации через + создаётся новая строка, данные копируются:
s := "hello" + " " + "world" // 2 аллокации
Для множественной конкатенации это очень дорого — O(n²) по памяти:
// Плохо — каждая итерация создаёт новую строку
var s string
for i := 0; i < 10000; i++ {
s += "x" // O(n²)
}
Правильные способы:
// strings.Builder — O(n), удваивает буфер
var b strings.Builder
for i := 0; i < 10000; i++ {
b.WriteString("x")
}
result := b.String()
// strings.Join для слайсов
result := strings.Join(parts, ", ")
strings.Builder использует []byte внутри и конвертирует в string без копирования.