Создаётся новая строка — аллокация памяти и копирование обеих строк. Строки в Go иммутабельны: s = s + "!" аллоцирует новый массив байт, копирует старые данные + новый символ.
Для единичной конкатенации a + b это нормально. В цикле — плохо: каждая итерация аллоцирует. Используй strings.Builder:
// плохо: O(n²)
result := ""
for _, s := range items {
result += s
}
// хорошо: O(n)
var b strings.Builder
for _, s := range items {
b.WriteString(s)
}